• <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 逛奔的蝸牛 閱讀(8786) 評論(1)  編輯 收藏 引用 所屬分類: Qt

            評論

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

            大香伊人久久精品一区二区| 久久婷婷人人澡人人爽人人爱| 99蜜桃臀久久久欧美精品网站| 久久精品国产亚洲AV香蕉| 色综合久久久久无码专区| 激情伊人五月天久久综合| 久久精品国产亚洲麻豆| 天堂无码久久综合东京热| 久久人妻无码中文字幕| 国产一级做a爰片久久毛片| 久久免费香蕉视频| 国产美女久久精品香蕉69| 狠狠久久综合伊人不卡| 性色欲网站人妻丰满中文久久不卡| 成人久久综合网| 国产精品免费久久久久影院| 蜜桃麻豆WWW久久囤产精品| 精品久久久久久国产91| 久久99九九国产免费看小说| 嫩草影院久久99| 无码国产69精品久久久久网站| 人妻精品久久久久中文字幕| 精品久久久久久国产潘金莲| 久久99久国产麻精品66| 久久久久久久综合日本| 亚洲国产精品久久久久| 无码人妻久久一区二区三区免费丨 | 国产成人AV综合久久| 观看 国产综合久久久久鬼色 欧美 亚洲 一区二区 | 91精品国产高清久久久久久91| 久久只有这里有精品4| 国产高潮国产高潮久久久91| 一本一本久久A久久综合精品| 热久久国产欧美一区二区精品| 青青青青久久精品国产| 18岁日韩内射颜射午夜久久成人| 亚洲欧洲日产国码无码久久99| 国产69精品久久久久观看软件| 欧美久久综合九色综合| 久久国产视屏| 久久综合色区|