【问题标题】:Checking then Adding items to QCompleter model检查然后将项目添加到 QCompleter 模型
【发布时间】:2012-12-17 00:25:57
【问题描述】:

我目前正在开发一个用 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】:

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

    祝你好运!

    【讨论】:

    • 谢谢您的回复,我的模型确实使用了stringList,将新单词添加到列表末尾的方法,是否允许添加重复的单词?或者仍然会使用您添加的方法来检查它是否在那里,如果没有然后添加?原谅我的无知:)
    猜你喜欢
    • 1970-01-01
    • 2020-06-17
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    相关资源
    最近更新 更多