-------------------------------------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/hufengvip/article/details/6555737

QLineEdit 自动完成(使用setCompleter,内含一个ListView)的更多相关文章

  1. Java-集合=第五题 (Map)设计Account 对象如下: private long id; private double balance; private String password; 要求完善设计,使得该Account 对象能够自动分配id。 给定一个List 如下: List list = new ArrayList(); list.add(new A

    第五题 (Map)设计Account 对象如下: private long id; private double balance; private String password; 要求完善设计,使得 ...

  2. Android一个ListView列表之中插入两种不同的数据

    http://www.cnblogs.com/roucheng/ Android一个ListView列表之中插入两种不同的数据 代码如下: public class ViewHolder{ Butto ...

  3. 一个ListView布局的不断演化

    刚出来工作,就负责一个APP的某块功能的编写,该功能就是类似微博那样的界面.微博界面的编写实际上是非常复杂的,虽然它只是一个ListView,但要想让这个ListView滑得动,是的,在一些配置低的手 ...

  4. Android由一个activity 间隔5秒自动跳转到另外一个activity

    Android由一个activity 间隔5秒自动跳转到另外一个activity 2013年10月10日18:03:42 //一.写一个定时器 5秒后开启        final Intent lo ...

  5. 安卓activity之间值共享解决办法,tabhost之间共享父类值,字符串类型的转换,获取每一个listview的item

    1.tabhost父类值共享的解决办法 dianzhanliebiao.java是传值页面,zhuyemian.java放的是tabhost,dianzhangaikuang.java是tabhost ...

  6. android 开发 实现一个ListView套嵌GirdView的滚动布局

    效果图 实现思维: 首先要处理管理好需要导入的数据,我们这里创建class来处理这些数据并且便于管理它们. 创建一个主activity的布局,里面需要一个ListView控件. 创建一个class继承 ...

  7. Android 关于在ScrollView中加上一个ListView,ListView内容显示不完全(总是显示第一项)的问题的两种简单的解决方案

    是这样的哈: 有这样一个需求: 1.显示一个界面,界面上有一个列表(ListView),列表上面有一个可以滚动的海报. 2.要求在ListView滚动的过程中,ListView上面的海报也可以跟着Li ...

  8. 自定义一个ListView实现聊天界面

    摘要 ListView可以称得上Android中最常用也最难用的控件了,几乎所有的应用程序都会用到它.由于手机屏幕空间都比较有限,能够一次性在屏幕上显示的内容并不多,当我们的程序中有大量的数据需要展示 ...

  9. 在ScrollView添加一个ListView造成的滚动问题的简单解决办法()

    正常来说,在ScrollView添加一个ListView后在真机上只会显示ListView的一行多一点,我也不理解为什么会这样,后来我把ListView的layout_height改成400dip,而 ...

随机推荐

  1. 承诺消费换4G无线上网伴侣活动火热来袭,各指定营业厅即可办理

    承诺消费换4G无线上网伴侣活动火热来袭,各指定营业厅即可办理 承诺消费换4G无线上网伴侣活动火热来袭,各指定营业厅即可办理

  2. JS中setTimeout()的使用方法具体解释

    1. SetTimeOut()              1.1 SetTimeOut()语法样例              1.2 用SetTimeOut()运行Function           ...

  3. PHP - 概述

    第1章 PHP概述 学习要点: 1.PHP基础知识 2.PHP的环境配置 3.安装三款主流程序 4.PHP开发工具的选择 5.一个简单的示例 一.PHP基础知识 PHP PHP是一种目前最流行的服务端 ...

  4. qingshow “不积跬步无以至千里,不积小流无以成江海”。--荀子《劝学篇》 用tomcat+花生壳搭建自己的web服务器+域名(参考)

    链接地址:http://www.blogjava.net/qingshow/archive/2010/01/17/309846.html 用tomcat搭建web服务器 目标:免费拥有自己的网站及域名 ...

  5. BZOJ 3173: [Tjoi2013]最长上升子序列( BST + LIS )

    因为是从1~n插入的, 慢插入的对之前的没有影响, 所以我们可以用平衡树维护, 弄出最后的序列然后跑LIS就OK了 O(nlogn) --------------------------------- ...

  6. loadrunner参数化总结

    Select next row:Sequential,Rondom,Unique Update value on:Each iteration,Each occurrence,Once 下面分别对这两 ...

  7. WCF技术剖析之十七:消息(Message)详解(上篇)

    原文:WCF技术剖析之十七:消息(Message)详解(上篇) [爱心链接:拯救一个25岁身患急性白血病的女孩[内有苏州电视台经济频道<天天山海经>为此录制的节目视频(苏州话)]]消息交换 ...

  8. perl use utf8

    utf8 Perl编译 来启用/禁用 UTF-8(or UTF-EBCDIC) 在源代码里 简洁: use utf8; no utf8; # Convert the internal represen ...

  9. attachEvent与addEventlistener兼容性

    关于原生事件绑定中attachEvent与addEventlistener中兼容性以及attachEvent函数中this指代window有关问题   请点击下面回答中的"采纳为答案&quo ...

  10. uva 10127 - Ones(数论)

    题目链接:uva 10127 - Ones 题目大意:给出n,问说者少要多少为1才干够整除n. 解题思路:等于是高精度取模,直到余数为0为止. #include <cstdio> #inc ...