然后检查然后将项目添加到QCompleter模型

问题描述 投票:0回答:1

我目前正在编写用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
}

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

我尝试过以下方法:

QAbstractItemModel *m = completer->model();
//dont know what to do with it now :(
qt qt4 qtextedit qcompleter
1个回答
1
投票

您可以通过使用来检查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");

祝好运!

© www.soinside.com 2019 - 2024. All rights reserved.