自定义多功能输入对话框:基于 Qt 打造灵活交互界面
一、引言
在使用 Qt 进行应用程序开发时,我们经常需要与用户进行交互,获取他们输入的各种信息。QInputDialog 是 Qt 提供的一个便捷工具,可用于简单的输入场景,但当需求变得复杂,需要支持更多类型的输入控件(如复选框、下拉列表等)时,就需要自定义输入对话框了。本文将详细介绍如何创建一个支持多种输入类型(包括文本输入、复选框、整数输入、浮点数输入和下拉列表)的自定义输入对话框类,并提供完整的代码示例和使用说明。
二、实现思路
我们将创建一个名为 CustomInputDialog 的类,它继承自 QDialog。这个类会根据用户提供的输入规格(包括输入项的标签和对应的输入类型)动态创建输入控件,并将它们添加到对话框的布局中。用户可以通过调用特定的方法获取每个输入项的值。
三、代码实现
3.1 CustomInputDialog.h 文件
#ifndef CUSTOMINPUTDIALOG_H
#define CUSTOMINPUTDIALOG_H#include <QDialog>
#include <QVBoxLayout>
#include <QLineEdit>
#include <QCheckBox>
#include <QSpinBox>
#include <QDoubleSpinBox>
#include <QPushButton>
#include <QFormLayout>
#include <QMap>
#include <QComboBox>class CustomInputDialog : public QDialog
{Q_OBJECT
public:enum InputType {TextInput,CheckboxInput,IntegerInput,DoubleInput,ComboBoxInput};// 新增一个参数用于传递下拉列表的选项CustomInputDialog(const QMap<QString, InputType>& inputSpecs, const QMap<QString, QStringList>& comboBoxOptions = QMap<QString, QStringList>(),QWidget *parent = nullptr);QVariant getValue(const QString& key) const;private:void setupUI();QMap<QString, InputType> inputSpecs;QMap<QString, QWidget*> inputWidgets;QMap<QString, QStringList> comboBoxOptions;
};#endif // CUSTOMINPUTDIALOG_H
代码解释:
- 枚举
InputType:定义了支持的输入类型,包括文本输入、复选框、整数输入、浮点数输入和下拉列表输入。 - 构造函数:接受两个参数,
inputSpecs用于指定输入项的标签和类型,comboBoxOptions用于存储下拉列表的选项。 getValue方法:根据输入项的标签获取用户输入的值,返回一个QVariant类型的值,方便进行不同类型的处理。
3.2 CustomInputDialog.cpp 文件
#include "CustomInputDialog.h"CustomInputDialog::CustomInputDialog(const QMap<QString, InputType>& inputSpecs, const QMap<QString, QStringList>& comboBoxOptions,QWidget *parent): QDialog(parent), inputSpecs(inputSpecs), comboBoxOptions(comboBoxOptions)
{setupUI();
}QVariant CustomInputDialog::getValue(const QString& key) const
{if (inputWidgets.contains(key)) {QWidget* widget = inputWidgets[key];switch (inputSpecs[key]) {case TextInput: {QLineEdit* lineEdit = qobject_cast<QLineEdit*>(widget);if (lineEdit) {return lineEdit->text();}break;}case CheckboxInput: {QCheckBox* checkBox = qobject_cast<QCheckBox*>(widget);if (checkBox) {return checkBox->isChecked();}break;}case IntegerInput: {QSpinBox* spinBox = qobject_cast<QSpinBox*>(widget);if (spinBox) {return spinBox->value();}break;}case DoubleInput: {QDoubleSpinBox* doubleSpinBox = qobject_cast<QDoubleSpinBox*>(widget);if (doubleSpinBox) {return doubleSpinBox->value();}break;}case ComboBoxInput: {QComboBox* comboBox = qobject_cast<QComboBox*>(widget);if (comboBox) {return comboBox->currentText();}break;}}}return QVariant();
}void CustomInputDialog::setupUI()
{QVBoxLayout* mainLayout = new QVBoxLayout(this);QFormLayout* formLayout = new QFormLayout;for (auto it = inputSpecs.begin(); it != inputSpecs.end(); ++it) {const QString& label = it.key();InputType type = it.value();QWidget* inputWidget = nullptr;switch (type) {case TextInput: {QLineEdit* lineEdit = new QLineEdit(this);inputWidget = lineEdit;break;}case CheckboxInput: {QCheckBox* checkBox = new QCheckBox(this);inputWidget = checkBox;break;}case IntegerInput: {QSpinBox* spinBox = new QSpinBox(this);inputWidget = spinBox;break;}case DoubleInput: {QDoubleSpinBox* doubleSpinBox = new QDoubleSpinBox(this);inputWidget = doubleSpinBox;break;}case ComboBoxInput: {QComboBox* comboBox = new QComboBox(this);if (comboBoxOptions.contains(label)) {comboBox->addItems(comboBoxOptions[label]);}inputWidget = comboBox;break;}}if (inputWidget) {formLayout->addRow(label, inputWidget);inputWidgets[label] = inputWidget;}}mainLayout->addLayout(formLayout);QPushButton* okButton = new QPushButton("确定", this);connect(okButton, &QPushButton::clicked, this, &CustomInputDialog::accept);mainLayout->addWidget(okButton);setLayout(mainLayout);
}
代码解释:
- 构造函数:调用
setupUI方法来初始化对话框的界面。 getValue方法:根据输入项的类型,将对应的控件中的值以QVariant类型返回。setupUI方法:根据inputSpecs动态创建输入控件,并将它们添加到QFormLayout中。对于下拉列表输入,会根据comboBoxOptions填充选项。最后添加一个 “确定” 按钮,点击后关闭对话框。
3.3 使用示例代码
#include <QApplication>
#include <QDebug>
#include "CustomInputDialog.h"int main(int argc, char *argv[])
{QApplication a(argc, argv);QMap<QString, CustomInputDialog::InputType> inputSpecs;inputSpecs["姓名"] = CustomInputDialog::TextInput;inputSpecs["是否同意协议"] = CustomInputDialog::CheckboxInput;inputSpecs["年龄"] = CustomInputDialog::IntegerInput;inputSpecs["成绩"] = CustomInputDialog::DoubleInput;inputSpecs["爱好"] = CustomInputDialog::ComboBoxInput;QMap<QString, QStringList> comboBoxOptions;comboBoxOptions["爱好"] = {"阅读", "运动", "音乐"};CustomInputDialog dialog(inputSpecs, comboBoxOptions);if (dialog.exec() == QDialog::Accepted) {qDebug() << "姓名:" << dialog.getValue("姓名").toString();qDebug() << "是否同意协议:" << (dialog.getValue("是否同意协议").toBool() ? "是" : "否");qDebug() << "年龄:" << dialog.getValue("年龄").toInt();qDebug() << "成绩:" << dialog.getValue("成绩").toDouble();qDebug() << "爱好:" << dialog.getValue("爱好").toString();}return a.exec();
}
代码解释:
- 定义了输入项的类型和下拉列表的选项。
- 创建
CustomInputDialog对象并显示对话框。 - 当用户点击 “确定” 按钮后,通过
getValue方法获取每个输入项的值并输出。
四、总结
通过自定义 CustomInputDialog 类,我们实现了一个支持多种输入类型的灵活输入对话框。这种方式可以满足复杂的用户交互需求,让应用程序更加友好和实用。你可以根据自己的需求进一步扩展这个类,添加更多类型的输入控件,或者对界面进行美化和优化。希望本文能帮助你在 Qt 开发中更好地处理用户输入。
更新升级的代码地址在:基于Qt打造灵活交互界面资源-CSDN文库 有需要的可以前往下载,支持更多的控件在输入对话框中
相关文章:
自定义多功能输入对话框:基于 Qt 打造灵活交互界面
一、引言 在使用 Qt 进行应用程序开发时,我们经常需要与用户进行交互,获取他们输入的各种信息。QInputDialog 是 Qt 提供的一个便捷工具,可用于简单的输入场景,但当需求变得复杂,需要支持更多类型的输入控件࿰…...
手写MVVM框架-环境搭建
项目使用 webpack 进行进行构建,初始化步骤如下: 1.创建npm项目执行npm init 一直下一步就行 2.安装webpack、webpack-cli、webpack-dev-server,html-webpack-plugin npm i -D webpack webpack-cli webpack-dev-server html-webpack-plugin 3.配置webpac…...
论文阅读:Realistic Noise Synthesis with Diffusion Models
这篇文章是 2025 AAAI 的一篇工作,主要介绍的是用扩散模型实现对真实噪声的仿真模拟 Abstract 深度去噪模型需要大量来自现实世界的训练数据,而获取这些数据颇具挑战性。当前的噪声合成技术难以准确模拟复杂的噪声分布。我们提出一种新颖的逼真噪声合成…...
JVM监控和管理工具
基础故障处理工具 jps jps(JVM Process Status Tool):Java虚拟机进程状态工具 功能 1:列出正在运行的虚拟机进程 2:显示虚拟机执行主类(main()方法所在的类) 3:显示进程ID(PID,Process Identifier) 命令格式 jps […...
【TensorFlow】T1:实现mnist手写数字识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 1、设置GPU import tensorflow as tf gpus tf.config.list_physical_devices("GPU")if gpus:gpu0 gpus[0]tf.config.experimental.set_memory_g…...
【ArcGIS_Python】使用arcpy脚本将shape数据转换为三维白膜数据
说明: 该专栏之前的文章中python脚本使用的是ArcMap10.6自带的arcpy(好几年前的文章),从本篇开始使用的是ArcGIS Pro 3.3.2版本自带的arcpy,需要注意不同版本对应的arcpy函数是存在差异的 数据准备:准备一…...
动静态库的学习
动静态库中,不需要包含main函数 文件分为内存级(被打开的)文件和磁盘级文件 库 每个程序都要依赖很多基础的底层库,本质上来说库是一种可执行代码的二进制形式,可以被载入内存执行 静态库 linux .a windows .lib 动态库 linux .…...
Rapidjson 实战
Rapidjson 是一款 C 的 json 库. 支持处理 json 格式的文档. 其设计风格是头文件库, 包含头文件即可使用, 小巧轻便并且性能强悍. 本文结合样例来介绍 Rapidjson 一些常见的用法. 环境要求 有如何的几种方法可以将 Rapidjson 集成到您的项目中. Vcpkg安装: 使用 vcpkg instal…...
DeepSeek的多模态AI模型-Janus-pro,可生图,可读图
简介 Janus-Pro 是由 DeepSeek 开发的一款多模态理解与生成模型,是 Janus 模型的升级版。它能够同时处理文本和图像,既能理解图像内容,又能根据文本描述生成高质量图像。Janus-Pro 的核心目标是通过解耦视觉编码路径,解决多模态理…...
Python爬虫实战:一键采集电商数据,掌握市场动态!
电商数据分析是个香饽饽,可市面上的数据采集工具要不贵得吓人,要不就是各种广告弹窗。干脆自己动手写个爬虫,想抓啥抓啥,还能学点技术。今天咱聊聊怎么用Python写个简单的电商数据爬虫。 打好基础:搞定请求头 别看爬虫…...
最短木板长度
最短木板长度 真题目录: 点击去查看 E 卷 100分题型 题目描述 小明有 n 块木板,第 i ( 1 ≤ i ≤ n ) 块木板长度为 ai。 小明买了一块长度为 m 的木料,这块木料可以切割成任意块,拼接到已有的木板上,用来加长木板。 小明想让最…...
【人工智能】掌握图像风格迁移:使用Python实现艺术风格的自动化迁移
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 图像风格迁移(Image Style Transfer)是一种基于深度学习的计算机视觉技术,通过将一张图像的内容与另一张图像的艺术风格结合,生成一幅具…...
git submodules
当代码仓库中包含 .gitmodules 文件时,这意味着该仓库使用了 Git 子模块(Git Submodules)。.gitmodules 文件记录了子模块的相关信息,如子模块的仓库地址、路径等。若要在下载代码时一并同步子模块,可以按照以下几种常…...
7 与mint库对象互转宏(macros.rs)
macros.rs代码定义了一个Rust宏mint_vec,它用于在启用mint特性时,为特定的向量类型实现与mint库中对应类型的相互转换。mint库是一个提供基本数学类型(如点、向量、矩阵等)的Rust库,旨在与多个图形和数学库兼容。这个宏…...
游戏引擎 Unity - Unity 下载与安装
Unity Unity 首次发布于 2005 年,属于 Unity Technologies Unity 使用的开发技术有:C# Unity 的适用平台:PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域:开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…...
[openwrt]openwrt slaac only模式下部分终端无法获取到IPv6 DNS
问题描述 OpenWrt 中,如果启用了 RA 单播(ra_unicast),但部分终端无法获取到 DNS 信息 问题分析 RA 单播的局限性 并非所有终端都完全支持通过单播接收 RA 消息。部分终端可能无法正确解析单播 RA 中的 RDNSS(Recursive DNS Server)选项,从而导致无法获取 DNS 信息。终…...
Java 面试真题
本题适合一到三年 Java 开发 ,以下问题都是按照原面试官提问记录 文章目录 我要进大厂系列面试题二面 我要进大厂系列面试题 全部真题,欢迎投稿你的面试经验。 本篇涉及基础较多,但要耐性看完。 JVM内存模型垃圾回收器用的哪个gc各个算法…...
验证工具:GVIM和VIM
一、定义与关系 gVim:gVim是Vim的图形界面版本,提供了更多的图形化功能,如菜单栏、工具栏和鼠标支持。它使得Vim的使用更加直观和方便,尤其对于不习惯命令行界面的用户来说。Vim:Vim是一个在命令行界面下运行的文本编…...
理解 C 与 C++ 中的 const 常量与数组大小的关系
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 💯前言💯数组大小的常量要求💯C 语言中的数组大小要求💯C 中的数组大小要求💯为什么 C 中 const 变量可以作为数组大小💯进一步的…...
孟加拉国_行政边界省市边界arcgis数据shp格式wgs84坐标
这篇内容将深入探讨孟加拉国的行政边界省市边界数据,该数据是以arcgis的shp格式提供的,并采用WGS84坐标系统。ArcGIS是一款广泛应用于地理信息系统(GIS)的专业软件,它允许用户处理、分析和展示地理空间数据。在GIS领域…...
安心即美的生活方式
如果你的心是安定的,那么,外界也就安静了。就像陶渊明说的:心远地自偏。不是走到偏远无人的边荒才能得到片刻清净,不需要使用洪荒之力去挣脱生活的枷锁,这是陶渊明式的中国知识分子的雅量。如果你自己是好的男人或女人…...
APT (Advanced Package Tool) 安装与使用-linux014
APT (Advanced Package Tool) APT (Advanced Package Tool) 是一个用于管理 Debian 和 Ubuntu 系列 Linux 发行版上的软件包的工具。它简化了软件的安装、升级、配置和删除过程。APT 为用户提供了一个统一的命令行接口,使得管理和安装软件变得更加简单。 APT 主要…...
深度学习篇---深度学习中的超参数张量转换模型训练
文章目录 前言第一部分:深度学习中的超参数1. 学习率(Learning Rate)定义重要性常见设置 2. 批处理大小(Batch Size)定义重要性常见设置 3. 迭代次数(Number of Epochs)定义重要性常见设置 4. 优…...
Java设计模式:行为型模式→状态模式
Java 状态模式详解 1. 定义 状态模式(State Pattern)是一种行为型设计模式,它允许对象在内部状态改变时改变其行为。状态模式通过将状态需要的行为封装在不同的状态类中,实现对象行为的动态改变。该模式的核心思想是分离不同状态…...
快速幂,错位排序笔记
记一下刚学明白的快速幂和错位排序的原理和代码 快速幂 原理: a^b (a^(b/2)) ^ 2(b为偶数) a^b a*(a^( (b-1)/2))^2(b为奇数) 指数为偶数时…...
机器人基础深度学习基础
参考: (1)【具身抓取课程-1】机器人基础 (2)【具身抓取课程-2】深度学习基础 1 机器人基础 从平面二连杆理解机器人学 正运动学:从关节角度到末端执行器位置的一个映射 逆运动学:已知末端位置…...
Java语法进阶
目录: Object类、常用APICollection、泛型List、Set、数据结构、CollectionsMap与斗地主案例异常、线程线程、同步等待与唤醒案例、线程池、Lambda表达式File类、递归字节流、字符流缓冲流、转换流、序列化流、Files网络编程 十二、函数式接口Stream流、方法引用 一…...
探索 paraphrase-MiniLM-L6-v2 模型在自然语言处理中的应用
在自然语言处理(NLP)领域,将文本数据转换为机器学习模型可以处理的格式是至关重要的。近年来,sentence-transformers 库因其在文本嵌入方面的卓越表现而受到广泛关注。本文将深入探讨 paraphrase-MiniLM-L6-v2 模型,这…...
《chatwise:DeepSeek的界面部署》
ChatWise:DeepSeek的界面部署 摘要 本文详细描述了DeepSeek公司针对其核心业务系统进行的界面部署工作。从需求分析到技术实现,再到测试与优化,全面阐述了整个部署过程中的关键步骤和解决方案。通过本文,读者可以深入了解DeepSee…...
论计算机网络技术专业如何?创新
计算机网络技术专业是顺应数字化时代发展的朝阳专业,前景十分广阔。它聚焦于计算机网络的规划、建设、维护与管理,从基础的网络布线、设备配置,到复杂的网络安全防护、云计算架构搭建,都在专业学习范畴内。该专业毕业生就业面广,可在互联网企业从事网络工程师岗位,负责搭…...
