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

【QT常用技术讲解】自定义支持多选项的下拉框

前言

        QComboBox是QT自带的下拉框组件,适合“从多个选项中选中一个”的场景,QComboBox可以显示checkbox,但效果也是“多选1”,本人在应用开发中,因为需要支持的勾选项比较多,全部显示在一个界面中会非常难看,需要一个能够收纳所有选项类型,并且不占位置的控件,那么把QComboBox改造成支持多选项即可。

效果图

功能讲解

以下讲解的自定义多选项列表框是加载mainwindow窗口中的,方便大家加入到自己的项目中。

自定义控件代码

//MultiSelectComboBox.h
#ifndef MULTISELECTCOMBOBOX_H
#define MULTISELECTCOMBOBOX_H#include <QComboBox>
#include <QListWidget>
#include <QLineEdit>
#include <QCheckBox>class MultiSelectComboBox : public QComboBox {Q_OBJECT
public:explicit MultiSelectComboBox(QWidget *parent = nullptr);void addItem(const QString &text);// 添加选项项QStringList selectedItems() const;signals:// 选项状态改变信号,参数为当前选中项的文本列表void itemCheckedStateChanged(const QStringList& selectpro);private slots:void updateSelectedItems();// 更新选中项显示private:QListWidget *listWidget;QLineEdit *lineEdit;
};
#endif
//MultiSelectComboBox.cpp
#include "MultiSelectComboBox.h"MultiSelectComboBox::MultiSelectComboBox(QWidget *parent): QComboBox(parent) {listWidget = new QListWidget(this);//列表控件(用于显示可选项目)lineEdit = new QLineEdit(this);//列表控件的文本编辑框(用于显示已选项)lineEdit->setReadOnly(true);// 设置为只读模式//设置模型和视图setModel(listWidget->model()); //设置列表控件的模型setView(listWidget);//设置列表控件为视图setLineEdit(lineEdit); //设置文本编辑框
}//添加选项
void MultiSelectComboBox::addItem(const QString &text) {QListWidgetItem *item = new QListWidgetItem(listWidget);// 创建列表项QCheckBox *checkBox = new QCheckBox(text, this);//创建带文本的复选框//将复选框添加到列表控件listWidget->addItem(item);listWidget->setItemWidget(item, checkBox);//连接复选框状态改变信号connect(checkBox, &QCheckBox::stateChanged, this, &MultiSelectComboBox::updateSelectedItems);
}//获取当前选中项文本列表
QStringList MultiSelectComboBox::selectedItems() const {QStringList items;for(int i = 0; i < listWidget->count(); ++i) {QCheckBox *checkBox = qobject_cast<QCheckBox*>(listWidget->itemWidget(listWidget->item(i)));if(checkBox && checkBox->isChecked()) {//如果复选框存在且被选中items << checkBox->text();}}return items;
}//更新选中项显示
void MultiSelectComboBox::updateSelectedItems() {lineEdit->setText(selectedItems().join(", "));//发射选项状态改变信号emit itemCheckedStateChanged(selectedItems());
}

mainwindow引用自定义控件

在mainwindow.ui的UI界面中,添加一个combobox控件,打开控件的右键菜单,选择“提升为...”,会弹出以下的对话框:

【提升的类名称】填写自定义控件中的类名称;

【头文件】填写mainwindow.cpp文件引用的自定义控件类所在的头文件(如果与mainwindow.cpp不在同一个目录下,需要带上路径);

继续点击添加、提升即可。

//mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "MultiSelectComboBox.h"
#include <QDebug>
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);ui->comboBox->addItem("类型1");ui->comboBox->addItem("类型2");ui->comboBox->addItem("类型3");ui->comboBox->addItem("类型4");ui->comboBox->addItem("类型5");QObject::connect(ui->pushButton, &QPushButton::clicked, [this](){qDebug() << "Selected:" << ui->comboBox->selectedItems();QMessageBox::information(this, "提示框", ui->comboBox->selectedItems().join(", "));});//连接信号---这里获取到当前最新的选项connect(ui->comboBox, &MultiSelectComboBox::itemCheckedStateChanged, [](const QStringList& selectpro) {for (const auto &item : selectpro) {qDebug() << "select:" << item;}qDebug() << "=====" ;});
}MainWindow::~MainWindow()
{delete ui;
}

引用很简单,ui->comboBox控件已经提升绑定为自定义的控件,直接引用成员函数。

    添加成员ui->comboBox->addItem("类型1");ui->comboBox->addItem("类型2");ui->comboBox->addItem("类型3");ui->comboBox->addItem("类型4");ui->comboBox->addItem("类型5");
//连接信号---这里获取到当前最新的选项,方便代码移植connect(ui->comboBox, &MultiSelectComboBox::itemCheckedStateChanged, [](const QStringList& selectpro) {for (const auto &item : selectpro) {qDebug() << "select:" << item;}qDebug() << "=====" ;});

篇尾

        本篇主要是通用多选项下拉列表框记录自定义控件开发,以及在mainwindow中引用自定义控件的方法。

http://www.dtcms.com/a/437916.html

相关文章:

  • 网址注册了怎么做网站小说网站自主建设
  • 基于PyTorch实现的MNIST手写数字识别神经网络笔记
  • 基于STM32单片机智能手表手环GSM短信上报GPS定位校时
  • 平台开发多少钱seo专员是什么意思
  • DAY23 单例设计模式、多例设计模式、枚举、工厂设计模式、动态代理
  • 在云服务器搭建部署私人饥荒联机版游戏服务器 [2025.10.3][ubuntu 24.04][腾讯云2核2G服务器]
  • 使用Go做一个分布式短链系统
  • 北京专业做网站设计公司全国高校教师网络培训中心
  • 元萝卜 1.0.9 | 免root支持XP模块,一键微信平板模式,游戏增强,应用多开
  • Unity Time参数:Maximum Particle Timestep
  • 网站运营包括哪些内容爱用建站怎么样
  • Java JVM --- JVM内存区域划分,类加载,GC垃圾回收
  • 做网站卖广告位赚钱吗最火的自媒体平台排名
  • 从“快递签收规则”看 sigaction:信号处理的“总开关”
  • 中国建设银行官网首页 网站网站顶部flash
  • 微服务项目(k8s集群)部署
  • linux网站建设技术指南 pdf郑州做网站华久科技
  • Conda 常用命令速查表
  • 网站建设如何网络销售html网页教程
  • 大模型面试题剖析:模型微调中冷启动与热启动的概念、阶段与实例解析
  • 计算机网络基础详解:从OSI模型到HTTP/HTTPS与Socket编程
  • 大型网站建设机构小程序订货系统
  • springboot多功能智能手机阅读APP设计与实现(代码+数据库+LW)
  • hadoop-hdfs-journalNode
  • 记一次手机付费充电设备研究
  • 做网站公司价格多少人事外包收费标准
  • 网站百度关键词排名软件网络舆情
  • 网站毕业设计任务书秦皇岛营销式网站制作
  • 注册公司网站源码建设银行企业网站无法打印回单
  • 文化馆的网站怎么建设seo文章外包