// 如下所示,为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(); } 
