现在的位置: 首页 > 综合 > 正文

自动完成的QLineEdit(非使用QCompleter版) 收藏

2014年02月18日 ⁄ 综合 ⁄ 共 7913字 ⁄ 字号 评论关闭

自动完成的QLineEdit(非使用QCompleter版) 收藏

-------------------------------------CompleteLineEdit.h-------------------------------------
view plaincopy to clipboardprint?
#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); // 动态的显示完成列表  
    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 
#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); // 动态的显示完成列表
    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
 

 

-------------------------------------CompleteLineEdit.cpp-------------------------------------
view plaincopy to clipboardprint?
#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 "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();
}
 

 

-------------------------------------main.cpp----------------------------------
view plaincopy to clipboardprint?
#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();  

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/starcloud_zxt/archive/2010/01/13/5186489.aspx

抱歉!评论已关闭.