我目前正在编写用Qt编写的代码编辑器,
我已经设法实现了我想要的大部分功能,即自动完成和语法高亮,但有一个我无法弄清楚的问题。
我创建了一个QCompleter
使用的模型,这对于html标签和c {+ 1}}等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
}
s模型中,如果不是我如何添加它?
我尝试了以下内容:
QCompleter
答案 0 :(得分: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");
祝你好运!