文章目录
一、补全功能示例图
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^/)
注:文章为作者编程过程中所遇到的问题和总结,内容仅供参考,若有错误欢迎指出。
注:如有侵权,请联系作者删除