界面开发框架Qt - 组合小部件映射器示例

news2024/11/29 12:40:29

Qt 是目前最先进、最完整的跨平台C++开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。

Combo Widget Mapper(组合小部件映射器)示例展示了如何使用自定义委托将信息从模型映射到表单上的特定小部件。

在简单小部件映射器(Simple Widget Mapper Example)示例中,我们展示了小部件映射器的基本用法,将模型公开的数据与用户界面中的简单输入小部件联系起来。然而有时我们希望使用输入小部件将数据作为选项公开给用户,例如QComboBox,并且需要一种方法将用户的输入与存储在模型中的值关联起来。

这个示例与简单部件映射器示例非常相似,同样创建了一个具有几乎相同用户界面的Window类,除了提供一个旋转框以便输入每个人的年龄之外,还提供了一个组合框来允许他们的地址被分类为“Home”、“Work”或“Other”。

点击获取Qt Widget组件下载(Q技术交流:166830288)

Window类定义

这个类提供了一个构造函数,一个插槽来保持按钮的更新,以及一个私有函数来设置模型:

class Window : public QWidget
{
Q_OBJECT

public:
Window(QWidget *parent = nullptr);

private slots:
void updateButtons(int row);

private:
void setupModel();

QLabel *nameLabel;
QLabel *addressLabel;
QLabel *typeLabel;
QLineEdit *nameEdit;
QTextEdit *addressEdit;
QComboBox *typeComboBox;
QPushButton *nextButton;
QPushButton *previousButton;

QStandardItemModel *model;
QStringListModel *typeModel;
QDataWidgetMapper *mapper;
};

除了QDataWidgetMapper对象和用于组成用户界面的控件之外,我们还使用QStandardItemModel保存数据,使用QStringListModel保存关于可以应用于每个人的数据的地址类型的信息。

Window类实现

Window类的构造函数可以分三部分解释,在第一部分中,我们设置了用于用户界面的小部件:

Window::Window(QWidget *parent)
: QWidget(parent)
{
setupModel();

nameLabel = new QLabel(tr("Na&me:"));
nameEdit = new QLineEdit();
addressLabel = new QLabel(tr("&Address:"));
addressEdit = new QTextEdit();
typeLabel = new QLabel(tr("&Type:"));
typeComboBox = new QComboBox();
nextButton = new QPushButton(tr("&Next"));
previousButton = new QPushButton(tr("&Previous"));

nameLabel->setBuddy(nameEdit);
addressLabel->setBuddy(addressEdit);
typeLabel->setBuddy(typeComboBox);

typeComboBox->setModel(typeModel);

请注意,我们以与其他小部件相同的方式设置组合框映射,但是将组合框自己的模型应用到组合框上,以便组合框将显示来自它自己的模型typeModel的数据,替代来自包含关于每个人的数据的模型。

接下来,我们设置小部件映射器,将每个输入小部件与调用setModel()指定的模型中的列关联起来:

mapper = new QDataWidgetMapper(this);
mapper->setModel(model);
mapper->addMapping(nameEdit, 0);
mapper->addMapping(addressEdit, 1);
mapper->addMapping(typeComboBox, 2, "currentIndex");

对于组合框,我们传递一个额外的参数来告诉小部件映射器哪个属性与模型中的值相关。因此,用户能够从组合框中选择一个项目,存储在小部件currentIndex属性中的相应值将存储在模型中。

构造函数的其余部分非常类似于简单部件映射器示例:

connect(previousButton, &QAbstractButton::clicked,
mapper, &QDataWidgetMapper::toPrevious);
connect(nextButton, &QAbstractButton::clicked,
mapper, &QDataWidgetMapper::toNext);
connect(mapper, &QDataWidgetMapper::currentIndexChanged,
this, &Window::updateButtons);

QGridLayout *layout = new QGridLayout();
layout->addWidget(nameLabel, 0, 0, 1, 1);
layout->addWidget(nameEdit, 0, 1, 1, 1);
layout->addWidget(previousButton, 0, 2, 1, 1);
layout->addWidget(addressLabel, 1, 0, 1, 1);
layout->addWidget(addressEdit, 1, 1, 2, 1);
layout->addWidget(nextButton, 1, 2, 1, 1);
layout->addWidget(typeLabel, 3, 0, 1, 1);
layout->addWidget(typeComboBox, 3, 1, 1, 1);
setLayout(layout);

setWindowTitle(tr("Delegate Widget Mapper"));
mapper->toFirst();
}

模型在窗口的setupModel()函数中初始化,在这里,我们创建了一个5行3列的标准模型。在每一行中插入一个名称、地址和一个指示地址类型的值,地址类型存储在字符串列表模型中。

void Window::setupModel()
{
QStringList items;
items << tr("Home") << tr("Work") << tr("Other");
typeModel = new QStringListModel(items, this);

model = new QStandardItemModel(5, 3, this);
QStringList names;
names << "Alice" << "Bob" << "Carol" << "Donald" << "Emma";
QStringList addresses;
addresses << "<qt>123 Main Street<br/>Market Town</qt>"
<< "<qt>PO Box 32<br/>Mail Handling Service"
"<br/>Service City</qt>"
<< "<qt>The Lighthouse<br/>Remote Island</qt>"
<< "<qt>47338 Park Avenue<br/>Big City</qt>"
<< "<qt>Research Station<br/>Base Camp<br/>Big Mountain</qt>";

QStringList types;
types << "0" << "1" << "2" << "0" << "2";

for (int row = 0; row < 5; ++row) {
QStandardItem *item = new QStandardItem(names[row]);
model->setItem(row, 0, item);
item = new QStandardItem(addresses[row]);
model->setItem(row, 1, item);
item = new QStandardItem(types[row]);
model->setItem(row, 2, item);
}
}

当我们将每一行插入模型时,就像数据库中的记录一样,存储了对应于每个人的地址类型的typeModel中的项的值。当小部件映射器从每行的最后一列读取这些值时,它将需要使用它们作为typeModel中值的引用,如下图所示。

为了完整起见,我们展示了updateButtons()插槽的实现:

void Window::updateButtons(int row)
{
previousButton->setEnabled(row > 0);
nextButton->setEnabled(row < model->rowCount() - 1);
}

组合框单独模型的使用提供了一个选项菜单,这些选项与存储在主模型中的数据是分开的。使用将组合框的currentIndex属性与模型中的列相关联的命名映射,可以有效地在模型中存储查找值。

然而,在小部件映射器上下文之外读取模型时,我们需要了解typeModel,以便理解这些查找值。如果能够将数据和typeModel所持有的选项都存储在一个地方,将会非常有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/422907.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

人工智能实验二:约束满足问题

一、实验目的 求解约束满足问题&#xff1b;使用回溯搜索算法求解八皇后问题。 二、实验平台 课程实训平台https://www.educoder.net/paths/369 三、实验内容及步骤 实训内容&#xff1a;2-4 第六章 约束满足问题 1.问题描述 八皇后问题是指在一个 88 的棋盘上摆放八个皇…

Spark运行模式介绍

文章目录1. Local运行模式1.1 基本运行情况介绍1.2 角色划分1.3 Spark 任务提交与解释器对比2. StandAlone运行模式2.1 StandAlone介绍2.2 StandAlone架构2.3 Spark应用架构2.4 StandAlone HA 运行原理3. Spark on YARN3.1 Spark on Yarn 本质3.2 部署模式3.3 两种部署模式运行…

stata变量引用

stata变量引用–潘登同学的stata笔记 文章目录stata变量引用--潘登同学的stata笔记变量生成gen命令通配符&#xff1a;*, ?, -因子变量时间序列变量命名、前缀与标签变量命名、添加前缀通配符与批量重命名变量标签数字-文字对应表CSMAR数据处理查看、查找变量单值、暂元单值暂…

TCP网络连接的书写

TCP网络连接的书写 文章目录TCP网络连接的书写服务器端书写进程sock创建创建bind进行端口绑定(进行bind的初始化)监听socket获取链接用户端创建sock套接字connect进行连接服务器端书写 为TCP是面向连接,所有需要进行对于端口进行监控&#xff0c;另外的UDP的服务器就不需要进行…

洛克菲勒:世界上只有两种人头脑聪明...

洛克菲勒&#xff1a;被人称为“石油大王”、美国第一位十亿富豪与全球首富、创办芝加哥大学。洛克菲勒写给儿子的信共有38封&#xff0c;这些信真实记录了洛克菲勒创造财富神话的种种业绩。从这些信中我们不仅可以看到洛克菲勒优良的品德、卓越的经商才能&#xff0c;还可窥见…

Spring面向切面编程AOP使用介绍

文章目录AOPAOP核心概念AOP快速入门AOP工作流程AOP切入点表达式AOP通知类型AOP通知获取数据AOP总结AOP AOP核心概念 AOP(Aspect Oriented Programming)面向切面编程&#xff0c;一种编程范式&#xff0c;指导开发者如何组织程序结构 OOP(Object Oriented Programming)面向对象…

Web自动化测试的详细流程和步骤,一篇足矣

Web自动化测试是软件测试中非常重要的一种测试方法&#xff0c;它通过编写脚本来模拟人工操作网页&#xff0c;从而实现对Web应用程序进行自动化测试的过程。为了保证测试质量和效率&#xff0c;我们需要遵循一定的流程和步骤来完成Web自动化测试。 一、测试环境准备 在进行W…

webp怎么转换成png,4个方法教你快速处理

webp怎么转换成png&#xff1f;目前在一些比较大的图片素材网站下载的图片都是webp格式的。我们都知道webp格式图片&#xff0c;它在正常的图片浏览器中是无法打开的。 所以说我们要把webp图片转变成png格式&#xff0c;正常来说我们常用的图片处理软件也能进行格式转换&#x…

都说互联网不行了,真的是这样吗?

最近在马士兵教育的课堂上经常会听到学员说这样的话&#xff1a; 现在公司都不招人&#xff0c;程序员根本找不到工作 早知道IT行业这么难&#xff0c;当初就不学编程了 简历石沉大海、面试机会也没有&#xff0c;互联网是不是不行了 互联网行情到底如何&#xff1f; 作为…

从此告别写SQL!DataLeap帮你零门槛完成“数据探查”

更多技术交流、求职机会&#xff0c;欢迎关注字节跳动数据平台微信公众号&#xff0c;回复【1】进入官方交流群 在日常数据处理工作中&#xff0c;产品、运营、研发或数据分析师经常会面临数据量大且混乱、质量参差不齐的问题&#xff0c;需要花费大量时间和精力校验表数据是否…

车企外卷:一个关于智能手机的“围城故事”

从2016年达到顶峰开始&#xff0c;全球智能手机出货量逐年下行&#xff0c;手机市场进入红海竞争逐渐成为了各界的共识。此后全球疫情与经济疲软的影响也进一步在手机市场施压&#xff0c;很多媒体认为手机产业距离“至暗时刻”已经不远。而在去年&#xff0c;新增变数&#xf…

Velocity tools进阶(下篇)

最近自己所做的项目使用到这个Velocity模板引擎&#xff0c;分享一下在互联网找的学习资料&#xff0c;仅供学习使用&#xff0c;不参与任何商业活动。 一. VelocityTools介绍 1.1 VelocityTools简介 Velocity Tools 是 Velocity模板引擎的一个子项目&#xff0c;用于将 Velo…

Excel玩转自然语言查询

ChatGPT火出圈&#xff0c;人类被人工智能替代又成为热门话题。有人欢喜&#xff0c;有人忧&#xff0c;也有人不以为意&#xff0c;觉得离自己工作远着呢&#xff0c;比如现在是用Excel做报表&#xff0c;有本事你动动嘴就直接把Excel里面的数据查询出来啊。 你可别说&#xf…

metersphere逻辑整理

整体架构 Frontend: MeterSphere 的前端工程, 基于 Vue.js 进行开发。 Backend: MeterSphere 的后端工程, 基于 Spring Boot 进行开发, 为 MeterSphere 的功能主体。 Chrome Plugin: 浏览器插件, 录制 Web 访问请求生成 JMeter 脚本并导入到 MeterSphere 中用于接口测试及性能…

阿里云产品试用更新,产品组合试用装更划算,快来免费上云吧

最近阿里云产品又上新了&#xff0c;尤其是推出了最新的产品组合试用装&#xff0c;个人觉得阿里云关于云产品的更新迭代是非常重视的&#xff0c;而且每次推出的产品不仅会惊艳到用户&#xff0c;而且产品功能也是随着一次迭代而更加完善、强大。前段时间也写了一篇关于为什么…

Nginx服务配置及相关模块

目录一、Nginx简介1、Nginx简介2、I/O模型相关概念3、Nginx事件驱动模型4、Nginx和Apache的区别二、编译安装Nginx服务1.关闭防火墙&#xff0c;将安装的Nginx软件包安装到opt目录下2、编译安装Nginx3、创建用户、组&#xff0c;以便于更好的管理4、创建软连接并启动5、停止Ngi…

FinClip 开发者工具重构升级!性能飞跃,体验有礼

一直以来不少开发者朋友在社区反馈&#xff0c;在使用 FIDE 工具的过程中&#xff0c;时常会遇到诸如加载不及时、代码预览/渲染性能不如意的情况&#xff0c;十分影响开发体验。 作为技术团队&#xff0c;我们深知一件趁手的开发工具对开发者的重要性&#xff0c;因此&#x…

企业AD域(域控服务器)的安装和配置详细教程

一、环境以及工具准备 软件&#xff1a;VMWare Workstation 2016 &#xff08; 下载链接&#xff1a;https://pan.baidu.com/s/1iX1VRilerYPGbGvX4pvaKw 提取码&#xff1a;75R6 &#xff09; 镜像&#xff1a;Windows Server 2016 &#xff08; 下载地址&#xff…

[CVPR 2020] Regularizing Class-Wise Predictions via Self-Knowledge Distillation

ContentsIntroductionClass-wise self-knowledge distillation (CS-KD)Class-wise regularizationEffects of class-wise regularizationExperimentsClassification accuracyReferencesIntroduction 为了缓解模型过拟合&#xff0c;作者提出 Class-wise self-knowledge distil…

SpringDataRedis客户端详解

SpringData是Spring中数据操作的模块&#xff0c;包含对各种数据库的集成&#xff0c;其中对Redis的集成模块就叫做SpringDataRedis&#xff0c;官网地址&#xff1a;https://spring.io/projects/spring-data-redis 提供了对不同Redis客户端的整合&#xff08;Lettuce和Jedis&…