【Qt编程】基于Qt的词典开发系列十四自动补全功能

2024-03-24 15:08

本文主要是介绍【Qt编程】基于Qt的词典开发系列十四自动补全功能,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    最近写了一个查单词的类似有道词典的软件,里面就有一个自动补全功能(即当你输入一个字母时,就会出现几个候选项)。这个自动补全功能十分常见,百度搜索关键词时就会出现。不过它们这些补全功能都是与你输入的进行首字匹配,有时也会不方便。例如,如果我输入一个“好”,如果是首字匹配的话会出现下图:


如果是句中匹配的话,则是这种情况:


你可以根据自己的要求进行选择哪一种模式。
    Qt中自带QCompleter类来实现上面的自动补全功能,读者可以在Qt自带的demo中很容易的学会该类的使用。下面我要讲的是自己构造一个比QCompleter更强大的类。有人会说,为什么有现成的不用,要自己写一个类呢?因为,我用QCompleter类的时候发现,它只有句首匹配模式(可能是我没仔细看文档,不知道可以改变模式),其次,当我的词库非常大的时候,有的时候就不会出现下拉自动补全列表,具体原因也不清楚。所以自己写了一个类,来实现QCompleter类所没有功能。废话不多说,直接见代码(代码注解比较详细,就不仔细讲解了,widget.ui文件也不给出了,就是一个空的界面):
1、widget.h
#ifndef WIDGET_H
#define WIDGET_H#include <QWidget>
#include<QMouseEvent>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();void mousePressEvent(QMouseEvent *event);
private:Ui::Widget *ui;
signals:void movesignal();
};#endif // WIDGET_H


2.completelineedit.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


3.widget.cpp
#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();
}


4.completelineedit.cpp
#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();
}


5.main.cpp
#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的词典开发系列

  1. 词典框架设计及成品展示
  2. 本地词典的设计
  3. 开始菜单的设计
  4. 无边框窗口的缩放与拖动
  5. 无边框窗口的拖动
  6. 界面美化设计
  7. 调用网络API
  8. 用户登录及API调用的实现
  9. JSON数据解析
  10. 国际音标的显示
  11. 系统托盘的显示
  12. 调用讲述人
  13. 音频播放
  14. 自动补全功能
  15. HTML特殊字符及正则表达式
  16. 后序
作品下载地址(发布版)http://download.csdn.net/detail/tengweitw/8548767
作品下载地址(绿色版)http://download.csdn.net/detail/tengweitw/8830495
源码下载地址http://download.csdn.net/detail/tengweitw/8830503


原文:http://blog.csdn.net/tengweitw/article/details/38689745

作者:nineheadedbird




这篇关于【Qt编程】基于Qt的词典开发系列十四自动补全功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/841967

相关文章

一文详解MySQL如何设置自动备份任务

《一文详解MySQL如何设置自动备份任务》设置自动备份任务可以确保你的数据库定期备份,防止数据丢失,下面我们就来详细介绍一下如何使用Bash脚本和Cron任务在Linux系统上设置MySQL数据库的自... 目录1. 编写备份脚本1.1 创建并编辑备份脚本1.2 给予脚本执行权限2. 设置 Cron 任务2

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

MyBatis Plus 中 update_time 字段自动填充失效的原因分析及解决方案(最新整理)

《MyBatisPlus中update_time字段自动填充失效的原因分析及解决方案(最新整理)》在使用MyBatisPlus时,通常我们会在数据库表中设置create_time和update... 目录前言一、问题现象二、原因分析三、总结:常见原因与解决方法对照表四、推荐写法前言在使用 MyBATis

Python使用smtplib库开发一个邮件自动发送工具

《Python使用smtplib库开发一个邮件自动发送工具》在现代软件开发中,自动化邮件发送是一个非常实用的功能,无论是系统通知、营销邮件、还是日常工作报告,Python的smtplib库都能帮助我们... 目录代码实现与知识点解析1. 导入必要的库2. 配置邮件服务器参数3. 创建邮件发送类4. 实现邮件

Java反射实现多属性去重与分组功能

《Java反射实现多属性去重与分组功能》在Java开发中,​​List是一种非常常用的数据结构,通常我们会遇到这样的问题:如何处理​​List​​​中的相同字段?无论是去重还是分组,合理的操作可以提高... 目录一、开发环境与基础组件准备1.环境配置:2. 代码结构说明:二、基础反射工具:BeanUtils

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3