在QTextEdit中加入自动提示功能――加入QCompleter功能

匿名 (未验证) 提交于 2019-12-03 00:22:01





// 如下所示,为QLineEdit添加自动提示功能 #include <QApplication> #include <QCompleter> #include <QLineEdit> #include <QStringList>  int main(int ac, char **av) {     QApplication app(ac, av);      QLineEdit *lineEdit = new QLineEdit;     QStringList indicator;     for (int index = 0; index < 3; ++index) {         indicator << QString("%1").arg(index);     }     QCompleter *completer = new QCompleter(indicator, lineEdit);     lineEdit->setCompleter(completer);     lineEdit->show();      return app.exec(); }

pic-1 : 自动提示

pic-2




(1)获取当前光标所在位置处,对应的单词。因为WordUnderCursor会忽略掉单次内的特殊符号,如$等,因此我们不能使用该方法。
(2)涉及到一个事件(QKeyEvent)和一个信号(activated())的处理。
(3)如何将QCompleter选中的字符串在QTextEdit中补全。

// completertextedit.h #ifndef COMPLETERTEXTEDIT_H #define COMPLETERTEXTEDIT_H  #include <QTextEdit> #include <QString>  QT_BEGIN_NAMESPACE  class QCompleter;  QT_END_NAMESPACE  class CompleterTextEdit : public QTextEdit {     Q_OBJECT public:     explicit CompleterTextEdit(QWidget *parent = 0);     void setCompleter(QCompleter *completer);  protected:     void keyPressEvent(QKeyEvent *e); // 响应按键盘事件  private slots:     void onCompleterActivated(const QString &completion); // 响应选中QCompleter中的选项后,QCompleter发出的activated()信号  private:     QString wordUnderCursor(); // 获取当前光标所在的单词  private:     QCompleter *m_completer;  };  #endif // COMPLETERTEXTEDIT_H
// completertextedit.cpp #include "completertextedit.h"  #include <QAbstractItemView> #include <QCompleter> #include <QKeyEvent> #include <QString> #include <QTextCursor>  CompleterTextEdit::CompleterTextEdit(QWidget *parent) :     QTextEdit(parent), m_completer(NULL) { }  void CompleterTextEdit::setCompleter(QCompleter *completer) {     m_completer = completer;     if (m_completer) {         m_completer->setWidget(this);         connect(m_completer, SIGNAL(activated(QString)),                 this, SLOT(onCompleterActivated(QString)));     } }  void CompleterTextEdit::keyPressEvent(QKeyEvent *e) {     if (m_completer) {         if (m_completer->popup()->isVisible()) {             switch(e->key()) {             case Qt::Key_Escape:             case Qt::Key_Enter:             case Qt::Key_Return:             case Qt::Key_Tab:                 e->ignore();                 return;             default:                 break;             }         }         QTextEdit::keyPressEvent(e);         QString completerPrefix = this->wordUnderCursor();         m_completer->setCompletionPrefix(completerPrefix); // 通过设置QCompleter的前缀,来让Completer寻找关键词         m_completer->complete();     } }  void CompleterTextEdit::onCompleterActivated(const QString &completion) {     QString completionPrefix = wordUnderCursor(),             shouldInertText = completion;     QTextCursor cursor = this->textCursor();     if (!completion.contains(completionPrefix)) {// delete the previously typed.         cursor.movePosition(QTextCursor::Left, QTextCursor::KeepAnchor, completionPrefix.size());         cursor.clearSelection();     } else { // 补全相应的字符         shouldInertText = shouldInertText.replace(             shouldInertText.indexOf(completionPrefix), completionPrefix.size(), "");     }     cursor.insertText(shouldInertText); }  QString CompleterTextEdit::wordUnderCursor() { //不断向左移动cursor,并选中字符,并查看选中的单词中是否含有空格――空格作为单词的分隔符     QTextCursor cursor = this->textCursor();     while (cursor.movePosition(QTextCursor::Left, QTextCursor::KeepAnchor)) {         if (cursor.selectedText().contains(" ")) {             break;         }     }     return cursor.selectedText().remove(" "); }
// main.cpp #include <QApplication> #include <QCompleter> #include <QLineEdit> #include <QStringList>  #include "completertextedit.h"  int main(int ac, char **av) {     QApplication app(ac, av);      CompleterTextEdit *textEdit = new CompleterTextEdit;     QStringList stringList;     for (int index = 0; index < 4; ++index) {         stringList << QString("%1%1%1%1").arg(index);     }     QCompleter *completer = new QCompleter(stringList, textEdit);     textEdit->setCompleter(completer);     textEdit->show();       return app.exec(); }

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!