本文介绍的是 Qt 自动完成LineEdit,一个录入界面上有一个lineEdit,用来录入代码进行检索。先来看内容。
Qt 自动完成LineEdit是本文要介绍的内容,内容虽少,取其精华。简单的代码实现出很好的效果,先来看内容。
CompleteLineEdit.h
- #ifndefCOMPLETELINEEDIT_H
- #defineCOMPLETELINEEDIT_H
- #include<QtGui/QLineEdit>
- #include<QStringList>
- classQListView;
- classQStringListModel;
- classQModelIndex;
- classCompleteLineEdit:publicQLineEdit{
- Q_OBJECT
- public:
- CompleteLineEdit(QStringListwords,QWidget*parent=0);
- publicslots:
- voidsetCompleter(constQString&text);//动态的显示完成列表
- voidcompleteText(constQModelIndex&index);//点击完成列表中的项,使用此项自动完成输入的单词
- protected:
- virtualvoidkeyPressEvent(QKeyEvent*e);
- virtualvoidfocusOutEvent(QFocusEvent*e);
- private:
- QStringListwords;//整个完成列表的单词
- QListView*listView;//完成列表
- QStringListModel*model;//完成列表的model
- };
- #endif//COMPLETELINEEDIT_H
- CompleteLineEdit.cpp
- #include"CompleteLineEdit.h"
- #include<QKeyEvent>
- #include<QtGui/QListView>
- #include<QtGui/QStringListModel>
- #include<QDebug>
- CompleteLineEdit::CompleteLineEdit(QStringListwords,QWidget*parent)
- :QLineEdit(parent),words(words){
- listView=newQListView(this);
- model=newQStringListModel(this);
- listView->setWindowFlags(Qt::ToolTip);
- connect(this,SIGNAL(textChanged(constQString&)),this,SLOT(setCompleter(constQString&)));
- connect(listView,SIGNAL(clicked(constQModelIndex&)),this,SLOT(completeText(constQModelIndex&)));
- }
- voidCompleteLineEdit::focusOutEvent(QFocusEvent*e){
- //listView->hide();
- }
- voidCompleteLineEdit::keyPressEvent(QKeyEvent*e){
- if(!listView->isHidden()){
- intkey=e->key();
- intcount=listView->model()->rowCount();
- QModelIndexcurrentIndex=listView->currentIndex();
- if(Qt::Key_Down==key){
- //按向下方向键时,移动光标选中下一个完成列表中的项
- introw=currentIndex.row()+1;
- if(row>=count){
- row=0;
- }
- QModelIndexindex=listView->model()->index(row,0);
- listView->setCurrentIndex(index);
- }elseif(Qt::Key_Up==key){
- //按向下方向键时,移动光标选中上一个完成列表中的项
- introw=currentIndex.row()-1;
- if(row<0){
- row=count-1;
- }
- QModelIndexindex=listView->model()->index(row,0);
- listView->setCurrentIndex(index);
- }elseif(Qt::Key_Escape==key){
- //按下Esc键时,隐藏完成列表
- listView->hide();
- }elseif(Qt::Key_Enter==key||Qt::Key_Return==key){
- //按下回车键时,使用完成列表中选中的项,并隐藏完成列表
- if(currentIndex.isValid()){
- QStringtext=listView->currentIndex().data().toString();
- setText(text);
- }
- listView->hide();
- }else{
- //其他情况,隐藏完成列表,并使用QLineEdit的键盘按下事件
- listView->hide();
- QLineEdit::keyPressEvent(e);
- }
- }else{
- QLineEdit::keyPressEvent(e);
- }
- }
- voidCompleteLineEdit::setCompleter(constQString&text){
- if(text.isEmpty()){
- listView->hide();
- return;
- }
- if((text.length()>1)&&(!listView->isHidden())){
- return;
- }
- //如果完整的完成列表中的某个单词包含输入的文本,则加入要显示的完成列表串中
- QStringListsl;
- foreach(QStringword,words){
- if(word.contains(text)){
- sl<<word;
- }
- }
- model->setStringList(sl);
- listView->setModel(model);
- if(model->rowCount()==0){
- return;
- }
- //Positionthetextedit
- listView->setMinimumWidth(width());
- listView->setMaximumWidth(width());
- QPointp(0,height());
- intx=mapToGlobal(p).x();
- inty=mapToGlobal(p).y()+1;
- listView->move(x,y);
- listView->show();
- }
- voidCompleteLineEdit::completeText(constQModelIndex&index){
- QStringtext=index.data().toString();
- setText(text);
- listView->hide();
- }
- main.cpp
- #include<QtGui/QApplication>
- #include"CompleteLineEdit.h"
- #include<QtGui>
- #include<QCompleter>
- #include<QStringList>
- intmain(intargc,char*argv[]){
- QApplicationa(argc,argv);
- QStringListsl=QStringList()<<"Biao"<<"Bin"<<"Huang"<<"Hua"<<"Hello"<<"BinBin"<<"Hallo";
- QWidgetwidgetw;
- CompleteLineEdit*edit=newCompleteLineEdit(sl);
- QPushButton*button=newQPushButton("Button");
- QHBoxLayout*layout=newQHBoxLayout();
- layout->addWidget(edit);
- layout->addWidget(button);
- widgetw.setLayout(layout);
- widgetw.show();
- CompleteLineEdite(sl);
- e.show();
- returna.exec();
- }
小结:Qt 自动完成LineEdit的内容介绍介绍完了,效果是不是很满意,希望本文对你有所帮助。
转载请说明出处
知优网 » 详解 Qt 自动完成LineEdit(qte自动完成什么意思)
知优网 » 详解 Qt 自动完成LineEdit(qte自动完成什么意思)