1. 获取QCompleter的生成的匹配结果
#include <QtWidgets/QCompleter>
#include <QtCore/QStringListModel>
#include <QtCore/QAbstractProxyModel>
QStringList searchList({"海","海龟","海底捞","海胆","火","大火","风火轮","海风"});
QCompleter c;
//模型填入父亲 c 后,completer searchList,后面替换不用主动析构
c.setModel(new QStringListModel(searchList,&c));
c.setCompletionMode(QCompleter::PopupCompletion);
c.setCaseSensitivity(Qt::CaseInsensitive);
c.setCompletionPrefix("海"); //搜索前缀
QAbstractProxyModel *completionModel = dynamic_cast<QAbstractProxyModel*>(c.completionModel());
int nCompletionCount = completionModel->rowCount();
QStringList searchRet;
for(int i=0 ; i<nCompletionCount ; ++i){
QModelIndex proxyIndex = completionModel->index(i,0);
QModelIndex completeIndex = completionModel->mapToSource(proxyIndex);
searchRet.push_back(completeIndex.data().toString());
}
2. 在内置的QLineEdit中使用QCompleter
2.1如何监听QCompleter按下的案件,如回车按键等
需要对lineedit的popup 安装事件过滤器
class CLineEdit : public QLineEdit{
Q_OBJECT
public:
CLineEdit(QWidget* parent = nullptr): QLineEdit(parent){}
~CLineEdit(){}
private:
bool eventFilter(QObject *obj, QEvent *event) override{
if(event->type() == QEvent::KeyPress || event->type() == QEvent::KeyRelease){
QKeyEvent *keyEvent = dynamic_cast<QKeyEvent*>(event);
if(keyEvent && ( keyEvent->key() == Qt::Key_Enter ||keyEvent->key() == Qt::Key_Return)){
return true;
}
}
return QObject::eventFilter(obj, event);
}
};
CLineEdit lineEdit;
lineEdit.setCompleter(new QCompleter);
lineEdit.completer()->popup()->installEventFilter(&lineEdit);