• <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); // 動態(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


            -------------------------------------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  回復(fù)  更多評論
              

            亚洲精品无码久久不卡| 伊人色综合久久天天人守人婷| 久久热这里只有精品在线观看| 久久久久国产精品三级网| 色综合合久久天天给综看| 午夜人妻久久久久久久久| 欧洲人妻丰满av无码久久不卡 | 午夜精品久久久内射近拍高清 | 久久99精品久久久久久不卡| 国产精品久久久天天影视| 99久久精品这里只有精品| 无码人妻久久一区二区三区蜜桃| 精品国产一区二区三区久久久狼| 成人精品一区二区久久| 日本强好片久久久久久AAA| 午夜不卡888久久| 久久久无码人妻精品无码| 狠狠色综合久久久久尤物| 青青草原综合久久大伊人| 国产成人久久久精品二区三区| 怡红院日本一道日本久久 | 亚洲精品国产字幕久久不卡 | 久久精品国产影库免费看| 国产伊人久久| 国内精品久久久久影院日本| 久久亚洲精品成人无码网站| 国产精品gz久久久| 99久久精品国产高清一区二区 | 国产99久久精品一区二区| 国产精品久久久久蜜芽| 无夜精品久久久久久| 国产99久久九九精品无码| 国产99久久精品一区二区| 麻豆一区二区99久久久久| 亚洲精品无码久久久影院相关影片 | 久久e热在这里只有国产中文精品99| 久久国产亚洲精品无码| 久久亚洲精品中文字幕| 久久久久久人妻无码| 久久亚洲AV成人出白浆无码国产 | 国产一区二区精品久久凹凸|