#ifndef COMPLETELINEEDIT_H
#define COMPLETELINEEDIT_H
#include <QtGui/QLineEdit>
#include <QStringList>
class QListView;
class QStringListModel;
class QModelIndex;
class CompleteLineEdit : public QLineEdit {
Q_OBJECT
public :
CompleteLineEdit(QStringList words, QWidget *parent = 0 );
public slots:
void setCompleter( const QString &text); // 動態(tài)的顯示完成列表
void completeText( const QModelIndex &index); // 點擊完成列表中的項,使用此項自動完成輸入的單詞
protected :
virtual void keyPressEvent(QKeyEvent *e);
virtual void focusOutEvent(QFocusEvent *e);
private :
QStringList words; // 整個完成列表的單詞
QListView *listView; // 完成列表
QStringListModel *model; // 完成列表的 model
};
#endif // COMPLETELINEEDIT_H
#include "CompleteLineEdit.h"
#include <QKeyEvent>
#include <QtGui/QListView>
#include <QtGui/QStringListModel>
#include <QDebug>
CompleteLineEdit::CompleteLineEdit(QStringList words, QWidget *parent)
: QLineEdit(parent), words(words) {
listView = new QListView( this );
model = new QStringListModel( this );
listView->setWindowFlags(Qt::ToolTip);
connect( this , SIGNAL(textChanged( const QString &)), this , SLOT(setCompleter( const QString &)));
connect(listView, SIGNAL(clicked( const QModelIndex &)), this , SLOT(completeText( const QModelIndex &)));
}
void CompleteLineEdit::focusOutEvent(QFocusEvent *e) {
//listView->hide();
}
void CompleteLineEdit::keyPressEvent(QKeyEvent *e) {
if (!listView->isHidden()) {
int key = e->key();
int count = listView->model()->rowCount();
QModelIndex currentIndex = listView->currentIndex();
if (Qt::Key_Down == key) {
// 按向下方向鍵時,移動光標選中下一個完成列表中的項
int row = currentIndex.row() + 1 ;
if (row >= count) {
row = 0 ;
}
QModelIndex index = listView->model()->index(row, 0 );
listView->setCurrentIndex(index);
} else if (Qt::Key_Up == key) {
// 按向下方向鍵時,移動光標選中上一個完成列表中的項
int row = currentIndex.row() - 1 ;
if (row < 0 ) {
row = count - 1 ;
}
QModelIndex index = listView->model()->index(row, 0 );
listView->setCurrentIndex(index);
} else if (Qt::Key_Escape == key) {
// 按下 Esc 鍵時,隱藏完成列表
listView->hide();
} else if (Qt::Key_Enter == key || Qt::Key_Return == key) {
// 按下回車鍵時,使用完成列表中選中的項,并隱藏完成列表
if (currentIndex.isValid()) {
QString text = listView->currentIndex().data().toString();
setText(text);
}
listView->hide();
} else {
// 其他情況,隱藏完成列表,并使用 QLineEdit 的鍵盤按下事件
listView->hide();
QLineEdit::keyPressEvent(e);
}
} else {
QLineEdit::keyPressEvent(e);
}
}
void CompleteLineEdit::setCompleter( const QString &text) {
if (text.isEmpty()) {
listView->hide();
return ;
}
if ((text.length() > 1 ) && (!listView->isHidden())) {
return ;
}
// 如果完整的完成列表中的某個單詞包含輸入的文本,則加入要顯示的完成列表串中
QStringList sl;
foreach(QString word, words) {
if (word.contains(text)) {
sl << word;
}
}
model->setStringList(sl);
listView->setModel(model);
if (model->rowCount() == 0 ) {
return ;
}
// Position the text edit
listView->setMinimumWidth(width());
listView->setMaximumWidth(width());
QPoint p( 0 , height());
int x = mapToGlobal(p).x();
int y = mapToGlobal(p).y() + 1 ;
listView->move(x, y);
listView->show();
}
void CompleteLineEdit::completeText( const QModelIndex &index) {
QString text = index.data().toString();
setText(text);
listView->hide();
}
#include <QtGui/QApplication>
#include "CompleteLineEdit.h"
#include <QtGui>
#include <QCompleter>
#include <QStringList>
int main( int argc, char *argv[]) {
QApplication a(argc, argv);
QStringList sl = QStringList() << "Biao" << "Bin" << "Huang" << "Hua" << "Hello" << "BinBin" << "Hallo" ;
QWidget widgetw;
CompleteLineEdit * edit= new CompleteLineEdit(sl);
QPushButton *button = new QPushButton( "Button" );
QHBoxLayout *layout = new QHBoxLayout();
layout->addWidget(edit);
layout->addWidget(button);
widgetw.setLayout(layout);
widgetw.show();
CompleteLineEdit e(sl);
e.show();
return a.exec();
}
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
