`
duyouhua1214
  • 浏览: 236260 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

QLineEdit 自动完成

    博客分类:
  • QT
阅读更多
-------------------------------------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();

}

 

来源:http://blog.csdn.net/hufeng825/article/details/6555737

分享到:
评论

相关推荐

    一个使用QLineEdit的示例代码,创建了一个简单的登录界面,包括用户名、密码和登录按钮,以及一些输入检查和提示功能:

    完成基本功能后,可以考虑优化用户体验,如增加输入验证的反馈提示、设置输入限制等。 以上就是关于使用QLineEdit创建简单登录界面涉及的主要知识点。通过理解和实践这些概念,你可以构建出更加复杂的用户界面,为...

    Qt数字软键盘 QLineEdit弹出

    这样,当用户在软键盘上按下数字键时,对应的数字会自动添加到QLineEdit中。此外,还应考虑添加一个“清除”或“删除”按钮,方便用户纠正输入。 最后,别忘了处理软键盘的关闭。在某些情况下,用户可能希望通过...

    一个简单的qt版测试QLineEdit单行输入框,面板上输入账号密码

    3. **获取用户输入**:当用户完成输入后,我们可以使用`text()`方法获取QLineEdit中的文本内容。 ```cpp QString account = accountLineEdit-&gt;text(); QString password = passwordLineEdit-&gt;text(); ``` **构建...

    文本编辑框内容自动补全

    `QCompleter`是Qt提供的一种用于自动完成文本输入的工具,它可以与`QLineEdit`、`QComboBox`等控件配合使用。自动补全功能通常在用户输入几个字符后,根据已有的数据集提供可能的匹配项,供用户选择,从而减少错误...

    Qt自动补全

    它能与任何支持QString类型的输入控件(如QLineEdit、QPlainTextEdit等)配合工作,当用户输入文本时,会根据已输入的部分自动列出匹配的候选词,方便用户选择。QCompleter的核心特性包括: 1. **模型-视图架构**:...

    QCombox自动提示,仿谷歌搜索功能

    这可以通过`QListWidget::addItem()`和`QListWidget::takeItem()`等方法完成。 4. **性能优化**:当数据源非常大时,实时遍历可能会导致性能问题。可以考虑使用数据结构(如字典或哈希表)来存储预处理过的关键词,...

    SecrchLineEdit

    在构建搜索框时,我们通常会基于QLineEdit进行扩展,添加额外的功能,如自动完成、实时搜索过滤或清除按钮。这可以通过继承QLineEdit类并重写其关键方法来实现。 例如,我们可以创建一个新的CSearchLineEdit类,...

    testLineEdit.zip

    8. **输入完成**:`QCompleter`类可以与`QLineEdit`配合,提供自动补全功能,提高用户体验。 9. **预设文本**:通过`setPlaceholderText()`方法可以设置提示文本,当`QLineEdit`为空时显示。 10. **可读性设置**:...

    untitled.zip

    总的来说,Qt 5.12.7中的QCompleter为QLineEdit提供了强大的自动补全功能,通过设置合适的模型和完成模式,可以在多种场景下提高用户的输入体验。结合提供的描述和标签,我们可以构建一个高效且用户友好的界面,使...

    文本框回车自动跳转.zip

    这个压缩包“文本框回车自动跳转.zip”显然包含了使用Qt框架编写的一个特定功能的示例项目,即当用户在文本框(QLineEdit)中按下回车键时,程序能自动进行下一步操作。下面我们将详细探讨Qt框架、QLineEdit类以及...

    completer.zip

    在编程领域,特别是使用Qt库进行开发时,`QCompleter`是一个非常重要的工具类,它为用户界面提供了自动完成的功能。这个`completer.zip`文件可能包含了一个关于如何在Qt应用程序中实现自动完成填充提示的示例或教程...

    QCompleter_test.zip

    在Qt编程中,QCompleter是一个非常实用的类,它为用户提供了一种自动补全功能,常见于QLineEdit和QComboBox等控件中。这个"QCompleter_test.zip"文件包含了一个小型的示例项目,演示了如何使用QCompleter来实现文本...

    QtCreator开发的搜索框

    这可以通过监听QLineEdit的`completer`属性来完成,它可以提供自动补全功能。创建一个`QCompleter`对象并设置其数据源,然后将其设置为QLineEdit的completer,即可实现这一功能。 ```cpp QCompleter *completer = ...

    Scribe-Text-Editor:使用Qt框架开发的文本编辑器。 具有标准文件操作,语法突出显示,大括号自动完成和自动缩进的功能

    "Scribe-Text-Editor" 还支持"大括号自动完成"功能。当用户输入一对大括号的开始部分时,编辑器会自动插入结束部分,提高编码效率。这一特性可以通过监听键盘事件,结合文本光标位置和当前输入内容实现。在 Qt 中,...

    Qt自定义搜索框代码实现

    `QLineEdit`是Qt中用于输入文本的控件,而`QCompleter`则用于自动完成或补全功能,常用于搜索框中提供用户友好的输入体验。 首先,我们需要创建一个`QLineEdit`实例作为搜索框的基础。通过设置`QLineEdit`的属性,...

    Python使用qtdesigner自动生成的桌面程序源码.zip

    打开Designer,创建一个新的窗体,然后从工具箱中拖动一个QPushButton(按钮)和一个QLineEdit(文本框)到窗口上。为按钮设置一个合适的文本,例如"点击我",并为其分配一个信号(如`clicked()`)。 在Qt Designer...

    qt-ip编辑控件封装

    2. **格式化显示**:为了使IP地址更易读,我们可以在输入完成后自动将文本格式化为标准的IP格式。这可以通过重写`textChanged`信号的槽函数来完成,当输入发生变化时,自动调整文本格式。 3. **错误提示**:如果...

    Qt调用日历

    然后,你可以连接QLineEdit的`editingFinished()`信号到日历的`show()`槽,这样当用户完成编辑后,日历会自动弹出: ```cpp connect(lineEdit, &QLineEdit::editingFinished, calendarWidget, &QCalendarWidget::...

Global site tag (gtag.js) - Google Analytics