鉴于工作用的是Qt开发,本人之前有学了一点C#,感觉C#蛮好用的,比如combobox的自动完成补全,就想Qt的QComboBox是否也能有此功能属性。找了半天终于让我找到了QCompleter。它的基本用法也是能实现根据输入自动补全。首先来看看以下基本用法
QStringList wordList;
wordList << "alpha" << "omega" << "omicron" << "zeta";
QLineEdit *lineEdit = new QLineEdit(this);
QCompleter *completer = new QCompleter(wordList, this);
completer->setCaseSensitivity(Qt::CaseInsensitive);
lineEdit->setCompleter(completer);
当然可以把QLineEdit换成QComboBox,但把QComboBox设置为可以编辑输入。setEditable(true)
除了可以补全普通的问题输入外,还可以补全路径:
QFileSystemModel *model = new QFileSystemModel;
model->setRootPath(QDir::currentPath());
completer->setModel(model);
怎么样,看起来很好用吧。
现在我们来看看这个方法setModel(QAbstractItemMode),它主要是设置completer的数据模型,也就是它显示的一些什么数据。 继承QAbstractItemMode的都可以用于设置completer的数据模型。
接下来看看还有什么方法和属性是我们比较关心的:
1、setCompletionMode(CompletionMode mode ),该方法是设置补全的方式,它有三种放松:QCompleter::PopupCompletion(默认情况),QCompleter::InlineCompletion,QCompleter::UnfilteredPopupCompletion
2、setMaxVisibleItems ( int maxItems ),这是在Qt4.6才被引入的一个属性,看方法就知道是用于设置最多可以显示几个数据项。
。。。。
现在有个问题,就是completer的数据是创建的时候就给定的,如果我想实现动态的添加,怎么办呢?
先看看我的解决方法吧:
connect(lineEdit,SIGNAL(editingFinished ()),this,SLOT(EditComplete()));
void Completer::EditComplete()
{
QString txt = m_pCompleter->currentCompletion();
if(txt == "")
{
wordList<<lineEdit->text();
m_pCompleter->setModel(new QStringListModel(wordList, this));
}
}
运行结果:
简单解释一下,每次输入数据时,如果没有匹配的项,就添加到wordList,重新设置completer的数据setModel
头一回写笔记,文字组织有点生硬,如有错误不足之处,望各位大侠指正