我目前正在研究用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");
祝你好运!