当前位置: 首页 > news >正文

Qt之QCompleter的简单使用(自动补全、文本框提示、下拉框提示含源码+注释)

文章目录

  • 一、补全功能示例图
    • 1.匹配包含
    • 2.匹配开头
    • 3.匹配结尾
  • 二、源码
    • 1.CCompleterTest.h
    • 2.CCompleterTest.cpp
    • 3.CCompleterTest.ui
      • 自定义动态属性值
  • 总结

一、补全功能示例图

1.匹配包含

下图演示了匹配文本包含的情况。
在这里插入图片描述

2.匹配开头

下图演示了匹配开头模式,可以看到匹配开头时,输入”王“只显示了”王五“,但当匹配包含时却显示了两个项。
在这里插入图片描述

3.匹配结尾

从下图可以看到匹配包含时,输入”张“显示了”张三“和”小张“,但当匹配结尾时却显示了”小张“,以此演示了匹配结尾的功能。
在这里插入图片描述

二、源码

【提示】因为在ui中使用了自定义动态属性,所以在此保留ui源码

1.CCompleterTest.h

#ifndef CCOMPLETERTEST_H
#define CCOMPLETERTEST_H

#include <QMainWindow>
#include <QCompleter> // 导入自动补全类头文件
#include <QDirModel> // 导入dir数据模型

namespace Ui {
class CCompleterTest;
}

class CCompleterTest : public QMainWindow
{
    Q_OBJECT

public:
    explicit CCompleterTest(QWidget *parent = nullptr);
    ~CCompleterTest();

    /**
     * @brief initChineseCompleter 中文名下拉框的补全类初始化
     */
    void initChineseCompleter();

    /**
     * @brief initEnglishCompleter 英文名文本框的补全类初始化
     */
    void initEnglishCompleter();

    /**
     * @brief initDirCompleter 目录文本框的补全类初始化
     */
    void initDirCompleter();

private slots:
    /**
     * @brief on_filterModeComboBox_currentIndexChanged 过滤模式下拉框切换按钮槽函数
     * @param arg1 切换后的文本
     */
    void on_filterModeComboBox_currentIndexChanged(const QString &arg1);

private:
    Ui::CCompleterTest *ui;

    QCompleter *m_chineseCompleter;     // 下拉列表框的自动补全类

    QCompleter *m_englishCompleter;     // 文本编辑框的自动补全类

    QCompleter *m_dirCompleter;         // 文本编辑框的自动补全类

    QDirModel  *m_dirModel;             // dir数据模型
};

#endif // CCOMPLETERTEST_H

2.CCompleterTest.cpp

#include "CCompleterTest.h"
#include "ui_CCompleterTest.h"

CCompleterTest::CCompleterTest(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::CCompleterTest)
{
    ui->setupUi(this);
    // 设置窗口标题
    this->setWindowTitle("自动补全类的使用");

    // 初始化中文名下拉框补全
    initChineseCompleter();

    // 初始化英文名文本框补全
    initEnglishCompleter();

    // 初始化目录文本框补全
    initDirCompleter();
}

CCompleterTest::~CCompleterTest()
{
    delete m_chineseCompleter;
    delete m_englishCompleter;
    delete m_dirModel;
    delete m_dirCompleter;
    delete ui;
}

void CCompleterTest::initChineseCompleter()
{
    // 创建下拉列表框的补全文本列表
    QStringList list;
    list << "张三" << "李四" << "小张" << "老王" << "小刘" << "王五";
    // 创建中文名下拉列表框补全类对象,并将文本列表传入补全类
    m_chineseCompleter = new QCompleter(list);
    // 设置默认过滤模式
    m_chineseCompleter->setFilterMode(Qt::MatchContains);

    //! 将补全类设置到下拉框中
    // 首先需要开启下拉框的编辑功能
    ui->chineseComboBox->setEditable(true);
    // 获取下拉框的lineEdit对象,设置其补全类
    ui->chineseComboBox->lineEdit()->setCompleter(m_chineseCompleter);
    // 并将文本列表添加到下拉框对象中
    ui->chineseComboBox->addItems(list);
    // 设置下拉框未选中
    ui->chineseComboBox->setCurrentIndex(-1);
}

void CCompleterTest::initEnglishCompleter()
{
    // 创建下拉列表框的补全文本列表
    QStringList list;
    list << "Tom" << "Lisa" << "Sam" << "Jerry" << "Bob" << "Annie";
    // 创建英文名文本框补全类对象,并将文本列表传入补全类
    m_englishCompleter = new QCompleter(list);
    // 设置默认过滤模式
    m_englishCompleter->setFilterMode(Qt::MatchContains);

    // 设置英文名文本框的补全类对象
    ui->englishEdit->setCompleter(m_englishCompleter);
}

void CCompleterTest::initDirCompleter()
{
    // 创建目录数据模型对象
    m_dirModel = new QDirModel;

    //! 创建目录提示框的补全类对象,并将目录数据模型传入补全类
    //! 除了初始化,还可通过setModel函数设置数据模型
    m_dirCompleter = new QCompleter(m_dirModel);

    // 设置目录文本框的补全类对象
    ui->dirEdit->setCompleter(m_dirCompleter);

}

void CCompleterTest::on_filterModeComboBox_currentIndexChanged(const QString &arg1)
{
    // 获取当前模式的MatchFlag整型值
    int flagVal = ui->filterModeComboBox->property(arg1.toStdString().data()).toInt();
    // 将模式值转换为Qt::MatchFlag类型
    Qt::MatchFlag flag = static_cast<Qt::MatchFlag>(flagVal);
    // 更新三个补全类的过滤模式
    m_chineseCompleter->setFilterMode(flag);
    m_englishCompleter->setFilterMode(flag);
    m_dirCompleter->setFilterMode(flag);
}

3.CCompleterTest.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>CCompleterTest</class>
 <widget class="QMainWindow" name="CCompleterTest">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>396</width>
    <height>266</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>CCompleterTest</string>
  </property>
  <widget class="QWidget" name="centralWidget">
   <layout class="QGridLayout" name="gridLayout">
    <item row="0" column="0" alignment="Qt::AlignRight">
     <widget class="QLabel" name="label_4">
      <property name="text">
       <string>补全类匹配模式:</string>
      </property>
     </widget>
    </item>
    <item row="0" column="1">
     <widget class="QComboBox" name="filterModeComboBox">
      <property name="sizePolicy">
       <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
      <property name="匹配包含" stdset="0">
       <number>1</number>
      </property>
      <property name="匹配开头" stdset="0">
       <number>2</number>
      </property>
      <property name="匹配结尾" stdset="0">
       <number>3</number>
      </property>
      <item>
       <property name="text">
        <string>匹配包含</string>
       </property>
      </item>
      <item>
       <property name="text">
        <string>匹配开头</string>
       </property>
      </item>
      <item>
       <property name="text">
        <string>匹配结尾</string>
       </property>
      </item>
     </widget>
    </item>
    <item row="1" column="0">
     <widget class="QLabel" name="label">
      <property name="text">
       <string>自动补全(中文)的下拉框:</string>
      </property>
     </widget>
    </item>
    <item row="1" column="1">
     <widget class="QComboBox" name="chineseComboBox">
      <property name="sizePolicy">
       <sizepolicy hsizetype="Preferred" vsizetype="Preferred">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
     </widget>
    </item>
    <item row="2" column="0">
     <widget class="QLabel" name="label_2">
      <property name="text">
       <string>自动补全(英文)的文本框:</string>
      </property>
     </widget>
    </item>
    <item row="2" column="1">
     <widget class="QLineEdit" name="englishEdit">
      <property name="sizePolicy">
       <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
     </widget>
    </item>
    <item row="3" column="0">
     <widget class="QLabel" name="label_3">
      <property name="text">
       <string>自动补全(目录)的文本框:</string>
      </property>
     </widget>
    </item>
    <item row="3" column="1">
     <widget class="QLineEdit" name="dirEdit">
      <property name="sizePolicy">
       <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
        <horstretch>0</horstretch>
        <verstretch>0</verstretch>
       </sizepolicy>
      </property>
     </widget>
    </item>
   </layout>
  </widget>
  <widget class="QMenuBar" name="menuBar">
   <property name="geometry">
    <rect>
     <x>0</x>
     <y>0</y>
     <width>396</width>
     <height>23</height>
    </rect>
   </property>
  </widget>
  <widget class="QToolBar" name="mainToolBar">
   <attribute name="toolBarArea">
    <enum>TopToolBarArea</enum>
   </attribute>
   <attribute name="toolBarBreak">
    <bool>false</bool>
   </attribute>
  </widget>
  <widget class="QStatusBar" name="statusBar"/>
 </widget>
 <layoutdefault spacing="6" margin="11"/>
 <resources/>
 <connections/>
</ui>

自定义动态属性值

在这里插入图片描述

总结

补全类在生活中输入文本还是比较常见,并且使用上没有特别的要求,直接调用设置即可,很是方便。

(前段时间电脑出问题了,因为疫情不能修理这些问题,后面还是会持续更新的)

友情提示——哪里看不懂可私哦,让我们一起互相进步吧
(创作不易,请留下一个免费的赞叭 谢谢 ^o^/)

注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除

相关文章:

  • MyBatis-Plus(二)
  • Linux-常见命令(三)
  • 【国庆活动】Spring Boot 必知必会的核心理念(二)
  • c++:程序流程结构,顺序结构,选择结构if else,三目运算符
  • 使用 Amazon Rekognition API 进行文本检测和 OCR
  • 内核驱动踩坑记录
  • 半导体中的杂质和缺陷能级
  • SSM毕设项目大学生心理咨询系统792l6(java+VUE+Mybatis+Maven+Mysql)
  • 嵌入式学习的第二天
  • R语言(4) plot函数介绍
  • JVM -- 垃圾回收器7种(四)
  • 模型调优:验证集的作用(就是为了调整超参数)
  • PyQt5之消息对话框
  • java计算机毕业设计校友闲置书籍管理平台源代码+数据库+系统+lw文档
  • Interactron | 体现自适应的目标检测器
  • angular2 简述
  • Computed property XXX was assigned to but it has no setter
  • cookie和session
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • gops —— Go 程序诊断分析工具
  • input实现文字超出省略号功能
  • Java|序列化异常StreamCorruptedException的解决方法
  • javascript 总结(常用工具类的封装)
  • java多线程
  • JS+CSS实现数字滚动
  • LeetCode29.两数相除 JavaScript
  • magento 货币换算
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • Python进阶细节
  • Solarized Scheme
  • Terraform入门 - 1. 安装Terraform
  • 订阅Forge Viewer所有的事件
  • 今年的LC3大会没了?
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 聊聊sentinel的DegradeSlot
  • 每天10道Java面试题,跟我走,offer有!
  • 每天一个设计模式之命令模式
  • 前端存储 - localStorage
  • 测评:对于写作的人来说,Markdown是你最好的朋友 ...
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • 整理一些计算机基础知识!
  • #162 (Div. 2)
  • #NOIP 2014# day.1 生活大爆炸版 石头剪刀布
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (10)STL算法之搜索(二) 二分查找
  • (C语言)fgets与fputs函数详解
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (Java)【深基9.例1】选举学生会
  • (LeetCode 49)Anagrams
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)linux使用docker容器运行mysql
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot码头作业管理系统 毕业设计 341654
  • (十五)devops持续集成开发——jenkins流水线构建策略配置及触发器的使用