• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            逛奔的蝸牛

            我不聰明,但我會很努力

               ::  :: 新隨筆 ::  ::  :: 管理 ::

            -------------------------------------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-------------------------------------

            #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----------------------------------

            #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();

            }


            posted on 2009-10-31 02:09 逛奔的蝸牛 閱讀(8775) 評論(1)  編輯 收藏 引用 所屬分類: Qt

            評論

            # re: Qt:自動完成的QLineEdit(非使用QCompleter版)[未登錄] 2012-02-25 17:39 tony
            這個代碼感覺bug比較多,我自己寫了一個稍微好一點的:http://download.csdn.net/detail/jyxpm/4089691  回復  更多評論
              

            99久久精品免费看国产免费| 亚洲欧美伊人久久综合一区二区| 99国产精品久久久久久久成人热| 精品久久久久久成人AV| 久久se精品一区精品二区| 久久国产高清一区二区三区| 一日本道伊人久久综合影| 欧美亚洲色综久久精品国产| 国产精品嫩草影院久久| 久久久久久精品无码人妻| 色噜噜狠狠先锋影音久久| 久久天天躁狠狠躁夜夜躁2014| 2020久久精品国产免费| 久久婷婷色综合一区二区| 亚洲国产精品久久| 麻豆AV一区二区三区久久| 久久久久亚洲精品中文字幕| 精品久久久久香蕉网| 久久精品国产亚洲AV影院| 久久天天躁狠狠躁夜夜不卡| 久久婷婷国产麻豆91天堂| 久久99亚洲网美利坚合众国| 国产精品成人久久久| 久久久久婷婷| 亚洲一本综合久久| 97精品久久天干天天天按摩| 亚洲精品白浆高清久久久久久| 亚洲国产精品综合久久网络 | 国产一区二区三区久久| 亚洲AV无一区二区三区久久| 国产精品99久久久久久宅男小说| 亚洲国产婷婷香蕉久久久久久| 亚洲国产精品久久久久婷婷软件| 97久久精品人妻人人搡人人玩 | 精品午夜久久福利大片| 波多野结衣中文字幕久久| 久久久久亚洲AV无码网站| 久久国产高潮流白浆免费观看| 久久久一本精品99久久精品88 | 国产午夜精品久久久久九九电影| 国产精品一区二区久久不卡 |