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

这篇具有很好参考价值的文章主要介绍了界面开发框架Qt - 组合小部件映射器示例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

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

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

在简单小部件映射器(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中值的引用,如下图所示。

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

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

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

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

然而,在小部件映射器上下文之外读取模型时,我们需要了解typeModel,以便理解这些查找值。如果能够将数据和typeModel所持有的选项都存储在一个地方,将会非常有用。文章来源地址https://www.toymoban.com/news/detail-413244.html

到了这里,关于界面开发框架Qt - 组合小部件映射器示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 17.unity粒子特效--Renderer模块、灯光模块、粒子系统组合、二级发射器、粒子间碰撞、粒子拖尾

    1. 粒子朝向(Stretched Billboard的使用) 一般创建的粒子系统,在 Renderer 模块里默认选择的 Render Mode 为 Billboard ,但是此模式下粒子的朝向总是向上的,有时希望粒子贴图头部的方向和粒子刚产生时的发射方向保持一致,此时可以使用拉伸广告牌 Stretched Billboard 模式,并将其拉

    2024年02月08日
    浏览(51)
  • QT-通用的软件界面框架,好看且实用

    常规软件开发,使用这种界面框架,基本是可以做很多个常规项目,比较有参考意义。 本次软件使用开发的环境是QT5.13.2+VS2017,不同的开发环境重新配置即可。 1、软件框架结构说明,不同界面独立不同的库来调用。 2、属性配置 (1)添加包含目录:$(SolutionDir) (2)添加库

    2024年02月11日
    浏览(38)
  • C++ Qt开发:SqlTableModel映射组件应用

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍 SqlTableModule 组件的常用方法及灵活运用。 在多数情况下我们需要使用SQL的方法

    2024年02月04日
    浏览(42)
  • C++ Qt开发:ComboBox下拉组合框组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍 ComboBox 下拉组合框组件的常用方法及灵活运用。 在Qt中,ComboBox(组合框)是一

    2024年02月04日
    浏览(42)
  • Qt学习_11_构建内嵌子界面与独立子界面的框架

    对于较大的Qt项目而言,弹出的 独立 子界面 与 根据菜单在主窗口内切换的 内嵌 子界面是我们所必须面对的问题。那么在项目框架对这两部分内容应该如何布局,才能让项目 更清爽 , 更规整 。是本文着重讨论的内容。下图给出我们的最终设计框架。 1.1.1 创建 首先介绍独

    2024年02月02日
    浏览(33)
  • C++ Qt开发:StringListModel字符串列表映射组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍 QStringListModel 字符串映射组件的常用方法及灵活运用。 QStringListModel 是 Qt 中用

    2024年02月04日
    浏览(49)
  • C++学习之路(七)C++ 实现简单的Qt界面(消息弹框、按钮点击事件监听)- 示例代码拆分讲解

    这个示例创建了一个主窗口,其中包含两个按钮。第一个按钮点击时会显示一个简单的消息框,第二个按钮点击时会执行一个特定的操作(在这个例子中,仅打印一条调试信息)。 功能描述: 创建窗口和布局: 使用 QWidget 和 QVBoxLayout 创建主窗口并设置垂直布局,将按钮放置

    2024年02月04日
    浏览(68)
  • [QT编程系列-3]:C++图形用户界面编程,QT框架快速入门培训 - 2- QT程序的运行框架:HelloWorld、常见控件、对象树原理

    目录 2. QT程序的运行框架 2.1 Hello World程序框架 2.2 QT Designer初识 2.3 用QT Designer设计用户登录界 上述示例代码中,首先根据应用程序的需求使用 QCoreApplication 或 QApplication 定义 app 对象。如果你的应用程序需要图形界面,则使用 QApplication,否则使用 QCoreApplication。然后,你可以

    2024年02月15日
    浏览(52)
  • 80.qt qml-QianWindow炫酷界面框架-新增Canvas动态背景

    如下图所示:    动图如下所示: 如果我们使用图片,对于分辨率大的显示时,如果图片太小会失真,如果图片太大会占用很大内存,而且如果是动态图背景,那么至少40MB大小了. 所以我们增加Canvas动态背景功能,而且Canvas还可以根据系统性能我们来进行内部代码优化.比单色背景有趣的

    2024年02月05日
    浏览(39)
  • QT界面开发杂记(五)

    QString转char* c_str()没有‘\\0’结尾可能导致一些错误可以使用以下方法解决: QString xmlPath = \\\"path\\\"; const char cXmlName[1024] = {0}; memcpy((void*)cXmlName,xmlPath.toStdString().c_str(),xmlPath.size()); char*转QString  

    2024年02月04日
    浏览(68)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包