详解 Qt 自动完成LineEdit
创始人
2024-08-01 15:50:59
0

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

详解 Qt 自动完成LineEdit

CompleteLineEdit.h

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

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

相关内容

热门资讯

如何允许远程连接到MySQL数... [[277004]]【51CTO.com快译】默认情况下,MySQL服务器仅侦听来自localhos...
如何利用交换机和端口设置来管理... 在网络管理中,总是有些人让管理员头疼。下面我们就将介绍一下一个网管员利用交换机以及端口设置等来进行D...
施耐德电气数据中心整体解决方案... 近日,全球能效管理专家施耐德电气正式启动大型体验活动“能效中国行——2012卡车巡展”,作为该活动的...
Windows恶意软件20年“... 在Windows的早期年代,病毒游走于系统之间,偶尔删除文件(但被删除的文件几乎都是可恢复的),并弹...
20个非常棒的扁平设计免费资源 Apple设备的平面图标PSD免费平板UI 平板UI套件24平图标Freen平板UI套件PSD径向平...
德国电信门户网站可实时显示全球... 德国电信周三推出一个门户网站,直观地实时提供其安装在全球各地的传感器网络检测到的网络攻击状况。该网站...
着眼MAC地址,解救无法享受D... 在安装了DHCP服务器的局域网环境中,每一台工作站在上网之前,都要先从DHCP服务器那里享受到地址动...
为啥国人偏爱 Mybatis,... 关于 SQL 和 ORM 的争论,永远都不会终止,我也一直在思考这个问题。昨天又跟群里的小伙伴进行...