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

一、补全功能示例图

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^/)

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lw向北.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值