选中然后将项目添加到 QCompleter 模型



我目前正在研究用Qt编写的代码编辑器,

我已经设法实现了我想要的大多数功能,即自动完成和语法突出显示,但有一个问题我无法弄清楚。

我创建了一个QCompleter使用的模型,这对于 html 标签和 c++ 关键字(如 if else 等)来说很好。

但是我想在用户输入变量时向完成器添加变量。

所以我在QTextEdit上创建了一个事件,它将得到这个词(我知道我需要检查以确保它是一个变量等,但我只想让它现在工作)。

void TextEdit::checkWord()
{
    //going to get the previous word and try to do something with it
    QTextCursor tc = textCursor();
    tc.movePosition(QTextCursor::PreviousWord);
    tc.select(QTextCursor::WordUnderCursor);
    QString word = tc.selectedText();
    //check to see it is in the model
}

但是现在我想弄清楚如何检查该词是否已在QCompleter模型中,如果不是,如何添加它?

我尝试了以下方法:

QAbstractItemModel *m = completer->model();
//dont know what to do with it now :(

您可以使用以下命令检查word是否真的在您的QCompleter

QAbstractItemModel *m = completer->model();

如您所见,方法 model() 返回指针const

这对检查程序很好,您可以像这样检查:

bool matched = false;
QString etalon("second");
QStringListModel *strModel = qobject_cast<QStringListModel*>(completer.model());
if (strModel!=NULL)
    foreach (QString str, strModel->stringList()) {
        if (str == etalon)
        {
            matched = true;
            break;
        }
    }
qDebug()<<matched;

但出于您的目的,我建议您声明QStringListModel,并将其连接到您的完成器,然后,根据Qt的MVC编程原则(http://doc.qt.digia.com/qt/model-view-programming.html),您必须通过模型执行所有操作。

你的代码可以是这样的:

// declaration
QCompleter completer;
QStringListModel completerModel;
// initialization
completer.setModel(&completerModel);
QStringList stringListForCompleter;
stringListForCompleter << "first" << "second" << "third";
completerModel.setStringList(stringListForCompleter);
// adding new word to your completer list
completerModel.setStringList(completerModel.stringList() << "New Word");

祝你好运!

最新更新