【Qt编程】基于Qt的词典开发系列<十四>自动补全功能
最近写了一个查单词的类似有道词典的软件,里面就有一个自动补全功能(即当你输入一个字母时,就会出现几个候选项)。这个自动补全功能十分常见,百度搜索关键词时就会出现。不过它们这些补全功能都是与你输入的进行首字匹配,有时也会不方便。例如,如果我输入一个“好”,如果是首字匹配的话会出现下图:
如果是句中匹配的话,则是这种情况:
#ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include<QMouseEvent> namespace Ui { class Widget; } class Widget : public QWidget { Q_OBJECT public: explicit Widget(QWidget *parent = 0); ~Widget(); void mousePressEvent(QMouseEvent *event); private: Ui::Widget *ui; signals: void movesignal(); }; #endif // WIDGET_H
#ifndef COMPLETELINEEDIT_H #define COMPLETELINEEDIT_H #include <QLineEdit> #include <QStringList> #include<QFile> #include<QTextCodec> #include<QDebug> 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 slots: void replyMoveSignal(); private: QStringList words; // 整个完成列表的单词 QListView *listView; // 完成列表 QStringListModel *model; // 完成列表的model }; #endif // COMPLETELINEEDIT_H
#include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget) { ui->setupUi(this); } Widget::~Widget() { delete ui; } void Widget::mousePressEvent(QMouseEvent *event) { emit movesignal(); }
#include "CompleteLineEdit.h" #include <QKeyEvent> #include <QListView> #include <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::replyMoveSignal() { 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; } //填充模式二 // if(word.indexOf(text,0,Qt::CaseInsensitive)==0)//必需与句首内容相同 // sl<<word; } model->setStringList(sl); listView->setModel(model); if (model->rowCount() == 0) { return; } // 设置列表的显示位置及大小 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(); }
#include <QApplication> #include "CompleteLineEdit.h" #include"widget.h" int main(int argc, char *argv[]) { QApplication a(argc, argv); QStringList sl; QFile *inFile=new QFile ("input.txt");//这个是你自己的词库 if(!inFile->open(QIODevice::ReadOnly|QIODevice::Text)) { qDebug()<<"cannot read!"; } while(!inFile->atEnd()) { QByteArray line = inFile->readLine(); QTextCodec* gbk_codec = QTextCodec::codecForName("GBK"); QString gbk_string = gbk_codec->toUnicode(line); if (!line.isEmpty()) sl << gbk_string.trimmed();//将文件中的词汇输入到sl中 } inFile->close();//关闭文件 sl<< "你好" << "好的" << "好吗" << "你的" << "真好啊" << "天真" << "你好吗"; Widget *w= new Widget(); CompleteLineEdit * edit= new CompleteLineEdit(sl,w); w->show(); // QObject::connect(w,SIGNAL(movesignal()),edit,SLOT(replyMoveSignal())); return a.exec(); }
最后放两张查单词软件用到的自动补全功能的截图:
基于Qt的词典开发系列
- 词典框架设计及成品展示
- 本地词典的设计
- 开始菜单的设计
- 无边框窗口的缩放与拖动
- 无边框窗口的拖动
- 界面美化设计
- 调用网络API
- 用户登录及API调用的实现
- JSON数据解析
- 国际音标的显示
- 系统托盘的显示
- 调用讲述人
- 音频播放
- 自动补全功能
- HTML特殊字符及正则表达式
- 后序
原文:http://blog.csdn.net/tengweitw/article/details/38689745
作者:nineheadedbird
【Qt编程】基于Qt的词典开发系列<十四>自动补全功能的更多相关文章
- 【Qt编程】基于Qt的词典开发系列<十>--国际音标的显示
在年前的一篇文章中,我提到要学习Qt.于是在这学期看了一个月的qt.现在大致对qt有了一些了解.但是现在导师又把我调到了android应用开发平台,所以说qt的学习要搁置了.本打算这学期做一个单词查询 ...
- 【Qt编程】基于Qt的词典开发系列<十二>调用讲述人
我们知道,win7系统自带有讲述人,即可以机器读出当前内容,具体可以将电脑锁定,然后点击左下角的按钮即可.之前在用Matlab写扫雷游戏的时候,也曾经调用过讲述人来进行游戏的语音提示.具体的Matla ...
- 【Qt编程】基于Qt的词典开发系列<十五>html特殊字符及正则表达式
1.html特殊字符的显示 我们知道html语言和C语言一样也有一些特殊字符,它们是不能正常显示的,必须经过转义,在网上可以查到如何显示这些字符,如下图所示: 上图给了最常用的特殊字符的显示,下面我们 ...
- 解决VS Code开发Python3语言自动补全功能不带括号的问题
Visual Studio Code(以下简称VS Code)用来开发Python3,还是很便利的,本身这个IDE就是轻量级的,才几十兆大小,通过安装插件的方式支持各种语言的开发.界面也美美哒,可以在 ...
- arcgis api 3.x for js 入门开发系列十四最近设施点路径分析(附源码下载)
前言 关于本篇功能实现用到的 api 涉及类看不懂的,请参照 esri 官网的 arcgis api 3.x for js:esri 官网 api,里面详细的介绍 arcgis api 3.x 各个类 ...
- BizTalk开发系列(十四) XML空白字符(WhiteSpace)
最近在做一个BizTalk项目,对XML文件的处理很复杂.本来是想找有没有方法可以一次性去除XML文件中节点和属性的值的空格.但是找了很久没有看到相关的方法.如果有知道该方法的麻烦跟我讲一下:cbcy ...
- ubuntu开发环境下eclipse的alt+/自动补全功能不能用
解决方法:windows ---preferences---General---keys ,把在搜索框中搜Word Completion,把该快捷键unbind,然后给content assist 绑 ...
- 解决VS Code开发Python3语言自动补全功能
1.打开设置界面 2)使用快捷键组合[Ctrl+Shift+p] . 输入setting,选中首选项的user setting模式设置界面 在打开的User Settings文件界面,搜索:pytho ...
- 【Qt编程】基于Qt的词典开发系列<二>--本地词典的设计
我设计的词典不仅可以实现在线查单词,而且一个重大特色就是具有丰富的本地词典库:我默认加入了八个类型的词典,如下所示: 由于是本人是通信专业,因此加入了华为通信词典.电子工程词典,又由于我喜爱编程,也加 ...
随机推荐
- SQLite 语法(http://www.w3cschool.cc/sqlite/sqlite-syntax.html)
SQLite 语法 SQLite 是遵循一套独特的称为语法的规则和准则.本教程列出了所有基本的 SQLite 语法,向您提供了一个 SQLite 快速入门. 大小写敏感性 有个重要的点值得注意,SQL ...
- java虚拟机 jvm java堆 方法区 java栈
java堆是java应用程序最密切的内存空间.几乎所有的对象都存在堆中.java堆完全自动化管理,通过垃圾回收机制,垃圾对象会自动清理,不需要显式释放. 根据java垃圾回收机制的不同,java堆可能 ...
- Android系统开机启动流程及init进程浅析
Android系统启动概述 Android系统开机流程基于Linux系统,总体可分为三个阶段: Boot Loader引导程序启动Linux内核启动Android系统启动,Launcher/app启动 ...
- [django]用日期来查询datetime类型字段
有一个model的字段是 DateTimeField,我现在要具体查询某一天date的数据,应该怎么用orm来查询呢? 指定年月日 YourModel.objects.filter(datetime_ ...
- MonoBehaviour介绍(Unity3D开发之一)
猴子原创,欢迎转载.转载请注明: 转载自Cocos2D开发网–Cocos2Dev.com,谢谢! 原文地址: http://www.cocos2dev.com/?p=486 猴子自学Unity已经一段 ...
- 所谓 Spinner 组件
Spinner组件在平常的开发过程中应该算是比较常用的隶属于Input Control的android控件了,所以我们很有必要掌握这一个知识点,下面我就来谈一谈我对这个组件的一些认识. 是什么? 下拉 ...
- Dynamics CRM Microsoft SQL Server 指定的数据库具有更高的版本
在做NLB部署时遇到这么个问题,CRMAPP1安装的CRM版本是6.1已经打了SP1补丁,而在CRMAPP2上的CRM安装包是6.0版本,在选择连接现有部署后,最后一步检测就出了问题,如下图所示. 看 ...
- GrabCut in One Cut(基于图割算法grabcut的一次快速图像分割的OpenCV实现)----目前效果最好的图割
One cut in grabcut(grabcut算法的非迭代实现?) 本文针对交互式图像分割中的图割算法,主要想翻译一篇英文文献.不足之处请大家指正. 这是博主近期看到的效果最好,实现最简单 ...
- Android开发技巧——PagerAdapter实现类的封装
ViewPager是android的support库中的一个控件,也是一个在许多应用开发中都用得比较多的控件.目前为止,对ViewPager的使用,我一般是用ViewPager + Fragment的 ...
- RabbitMQ消息队列(六):使用主题进行消息分发
在上篇文章RabbitMQ消息队列(五):Routing 消息路由 中,我们实现了一个简单的日志系统.Consumer可以监听不同severity的log.但是,这也是它之所以叫做简单日志系统的原因, ...