本文介绍的是 Qt 自动完成LineEdit,一个录入界面上有一个lineEdit,用来录入代码进行检索。先来看内容。

Qt 自动完成LineEdit是本文要介绍的内容,内容虽少,取其精华。简单的代码实现出很好的效果,先来看内容。

详解 Qt 自动完成LineEdit(qte自动完成什么意思)  LineEdit 第1张

CompleteLineEdit.h

  1. #ifndefCOMPLETELINEEDIT_H
  2. #defineCOMPLETELINEEDIT_H
  3. #include<QtGui/QLineEdit>
  4. #include<QStringList>
  5. classQListView;
  6. classQStringListModel;
  7. classQModelIndex;
  8. classCompleteLineEdit:publicQLineEdit{
  9. Q_OBJECT
  10. public:
  11. CompleteLineEdit(QStringListwords,QWidget*parent=0);
  12. publicslots:
  13. voidsetCompleter(constQString&text);//动态的显示完成列表
  14. voidcompleteText(constQModelIndex&index);//点击完成列表中的项,使用此项自动完成输入的单词
  15. protected:
  16. virtualvoidkeyPressEvent(QKeyEvent*e);
  17. virtualvoidfocusOutEvent(QFocusEvent*e);
  18. private:
  19. QStringListwords;//整个完成列表的单词
  20. QListView*listView;//完成列表
  21. QStringListModel*model;//完成列表的model
  22. };
  23. #endif//COMPLETELINEEDIT_H
  24. CompleteLineEdit.cpp
  25. #include"CompleteLineEdit.h"
  26. #include<QKeyEvent>
  27. #include<QtGui/QListView>
  28. #include<QtGui/QStringListModel>
  29. #include<QDebug>
  30. CompleteLineEdit::CompleteLineEdit(QStringListwords,QWidget*parent)
  31. :QLineEdit(parent),words(words){
  32. listView=newQListView(this);
  33. model=newQStringListModel(this);
  34. listView->setWindowFlags(Qt::ToolTip);
  35. connect(this,SIGNAL(textChanged(constQString&)),this,SLOT(setCompleter(constQString&)));
  36. connect(listView,SIGNAL(clicked(constQModelIndex&)),this,SLOT(completeText(constQModelIndex&)));
  37. }
  38. voidCompleteLineEdit::focusOutEvent(QFocusEvent*e){
  39. //listView->hide();
  40. }
  41. voidCompleteLineEdit::keyPressEvent(QKeyEvent*e){
  42. if(!listView->isHidden()){
  43. intkey=e->key();
  44. intcount=listView->model()->rowCount();
  45. QModelIndexcurrentIndex=listView->currentIndex();
  46. if(Qt::Key_Down==key){
  47. //按向下方向键时,移动光标选中下一个完成列表中的项
  48. introw=currentIndex.row()+1;
  49. if(row>=count){
  50. row=0;
  51. }
  52. QModelIndexindex=listView->model()->index(row,0);
  53. listView->setCurrentIndex(index);
  54. }elseif(Qt::Key_Up==key){
  55. //按向下方向键时,移动光标选中上一个完成列表中的项
  56. introw=currentIndex.row()-1;
  57. if(row<0){
  58. row=count-1;
  59. }
  60. QModelIndexindex=listView->model()->index(row,0);
  61. listView->setCurrentIndex(index);
  62. }elseif(Qt::Key_Escape==key){
  63. //按下Esc键时,隐藏完成列表
  64. listView->hide();
  65. }elseif(Qt::Key_Enter==key||Qt::Key_Return==key){
  66. //按下回车键时,使用完成列表中选中的项,并隐藏完成列表
  67. if(currentIndex.isValid()){
  68. QStringtext=listView->currentIndex().data().toString();
  69. setText(text);
  70. }
  71. listView->hide();
  72. }else{
  73. //其他情况,隐藏完成列表,并使用QLineEdit的键盘按下事件
  74. listView->hide();
  75. QLineEdit::keyPressEvent(e);
  76. }
  77. }else{
  78. QLineEdit::keyPressEvent(e);
  79. }
  80. }
  81. voidCompleteLineEdit::setCompleter(constQString&text){
  82. if(text.isEmpty()){
  83. listView->hide();
  84. return;
  85. }
  86. if((text.length()>1)&&(!listView->isHidden())){
  87. return;
  88. }
  89. //如果完整的完成列表中的某个单词包含输入的文本,则加入要显示的完成列表串中
  90. QStringListsl;
  91. foreach(QStringword,words){
  92. if(word.contains(text)){
  93. sl<<word;
  94. }
  95. }
  96. model->setStringList(sl);
  97. listView->setModel(model);
  98. if(model->rowCount()==0){
  99. return;
  100. }
  101. //Positionthetextedit
  102. listView->setMinimumWidth(width());
  103. listView->setMaximumWidth(width());
  104. QPointp(0,height());
  105. intx=mapToGlobal(p).x();
  106. inty=mapToGlobal(p).y()+1;
  107. listView->move(x,y);
  108. listView->show();
  109. }
  110. voidCompleteLineEdit::completeText(constQModelIndex&index){
  111. QStringtext=index.data().toString();
  112. setText(text);
  113. listView->hide();
  114. }
  115. main.cpp
  116. #include<QtGui/QApplication>
  117. #include"CompleteLineEdit.h"
  118. #include<QtGui>
  119. #include<QCompleter>
  120. #include<QStringList>
  121. intmain(intargc,char*argv[]){
  122. QApplicationa(argc,argv);
  123. QStringListsl=QStringList()<<"Biao"<<"Bin"<<"Huang"<<"Hua"<<"Hello"<<"BinBin"<<"Hallo";
  124. QWidgetwidgetw;
  125. CompleteLineEdit*edit=newCompleteLineEdit(sl);
  126. QPushButton*button=newQPushButton("Button");
  127. QHBoxLayout*layout=newQHBoxLayout();
  128. layout->addWidget(edit);
  129. layout->addWidget(button);
  130. widgetw.setLayout(layout);
  131. widgetw.show();
  132. CompleteLineEdite(sl);
  133. e.show();
  134. returna.exec();
  135. }

小结:Qt 自动完成LineEdit的内容介绍介绍完了,效果是不是很满意,希望本文对你有所帮助。

转载请说明出处
知优网 » 详解 Qt 自动完成LineEdit(qte自动完成什么意思)

发表评论

您需要后才能发表评论