近期,在解读一个项目的Demo时,用到了不少Qt 开发的一些技术,其中有一个内容就是Wigdet Mapper功能。有些看不明白,对照《QtCreator快速入门》这本书的相关介绍,才知道这是有关模型、视图编程的内容。在处理一些大容量数据上会很方便。

数据-窗口映射器(QDataWidgetMapper)类在数据模型的一个区域和一个窗口部件提供了一个映射。这样就可以实现在一个窗口部件上显示和编辑一个模型中的一行数据。

Qt5 的官方提供了一个简单的实例 效果如下:
这个实例非常简单,首先会创建一个窗体(window),该窗体的一些部件会显示一些数据。通过按钮可是显示数据模型中的不同记录。

具体实现过程如下:

定义一个窗体的类用来实现4项内容:
1、构造窗体
2、添加信号槽用于更新记录
3、私有对象中添加实现建立数据模型的函数
4、以代码方式添加相关的控件。

class Window : public QWidget{Q_OBJECTpublic:Window(QWidget *parent = nullptr);private slots:void updateButtons(int row);private:void setupModel();QLabel *nameLabel;QLabel *addressLabel;QLabel *ageLabel;QLineEdit *nameEdit;QTextEdit *addressEdit;QSpinBox *ageSpinBox;QPushButton *nextButton;QPushButton *previousButton;QStandardItemModel *model;QDataWidgetMapper *mapper;};

这里,数据-窗口映射器(QDataWidgetMapper)来实现用户的接口。
标准数据模型来处理数据。

窗体类的实现

窗体的构造函数实现三个部分
1、创建控件,并且将标签(Lable)和输入部件(input Widget)建立伙伴关系。

  Window::Window(QWidget *parent): QWidget(parent){setupModel();nameLabel = new QLabel(tr("Na&me:"));nameEdit = new QLineEdit();addressLabel = new QLabel(tr("&Address:"));addressEdit = new QTextEdit();ageLabel = new QLabel(tr("A&ge (in years):"));ageSpinBox = new QSpinBox();nextButton = new QPushButton(tr("&Next"));previousButton = new QPushButton(tr("&Previous"));nameLabel->setBuddy(nameEdit);addressLabel->setBuddy(addressEdit);ageLabel->setBuddy(ageSpinBox);

2、建立控件的映射(widget mapper),同时通过按钮(Next)和按钮(Previous)分别与信号槽 toNext() 和 toPrevious() 相连接。

mapper = new QDataWidgetMapper(this);mapper->setModel(model);mapper->addMapping(nameEdit, 0);mapper->addMapping(addressEdit, 1);mapper->addMapping(ageSpinBox, 2);connect(previousButton, &QAbstractButton::clicked, mapper, &QDataWidgetMapper::toPrevious);connect(nextButton, &QAbstractButton::clicked, mapper, &QDataWidgetMapper::toNext);connect(mapper, &QDataWidgetMapper::currentIndexChanged, this, &Window::updateButtons);

3、通过栅格化布局窗体部件的呈现方式,同时也设置好窗体的名称,并将数据定位到数据模型的最前面一项。

     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(ageLabel, 3, 0, 1, 1);layout->addWidget(ageSpinBox, 3, 1, 1, 1);setLayout(layout);setWindowTitle(tr("Simple Widget Mapper"));mapper->toFirst();

建立数据模型

setupModel()函数建立5行3列的标准数据模型,同时,初始化相关的一些数据

void Window::setupModel(){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 ages;ages << "20" << "31" << "32" << "19" << "26";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(ages[row]);model->setItem(row, 2, item);}}

这样,就实现了数据模型与窗体控件的对应关系:


这样,基本就实现了。如果想让导航按钮(previous 、next)的显示更友好,可以添加下面的代码:

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

Qt5 中 关于Widget Mapper的简单应用相关推荐

  1. 【SQLite3+Qt开发】SQLite3简要介绍+在Qt5中的使用步骤

    目录 一.SQLite简要介绍 什么是SQLite? 为什么要用SQLite? SQLite下载 二.在Qt5中使用步骤 第一步:导入sqlite3相关文件 第二步:打开qt 修改  .pro文件,添 ...

  2. 将模型数据与QComboBox关联: Combo Widget Mapper Example

    将模型数据与QComboBox关联: Combo Widget Mapper Example 将模型公开的数据与用户界面中的简单输入小部件QComboBox关联起来 位置 Examples\Qt-xx ...

  3. Linux 内核中的 Device Mapper 机制

    本文结合具体代码对 Linux 内核中的 device mapper 映射机制进行了介绍.Device mapper 是 Linux 2.6 内核中提供的一种从逻辑设备到物理设备的映射框架机制,在该机 ...

  4. Qt5 中 QWebEngineView 的使用,让桌面客户端和 web 端友好通信

    一.本文结构 Qt5 中 web 开发的基本配置,工程搭建. 加载 HTML 文件. Qt 界面窗口调用 HTML 中的 JavaScript 函数(Qt 调用 js) Qt 界面窗口获取 HTML ...

  5. 给Flutter中的Widget设置透明度

    给Flutter中的Widget设置透明度 在项目开发中,需要经常用到透明度:比如在app中弹出一个提示框,这个时候的提示框就需要上下左右离边距有一定的距离,然后背景色舍黑色,需要设置透明度为0.4: ...

  6. Android中MaterialSearchView(搜索框)的简单实用

    Android中MaterialSearchView(搜索框)的简单实用 收搜框架有好多,动画效果满炫酷的就是代码太多,没发抽取他的搜索功能,而这个却比较好用些,直接从代码里面抠出来一个简单实现搜索功 ...

  7. 通用 Mapper UUID 简单示例

    通用 Mapper UUID 简单示例 不可回写的 UUID 通用 Mapper 中对 UUID 的用法主要提到了一种专有的写法,如下写法: @GeneratedValue(generator = & ...

  8. android计算器功能实现,在android中利用 studio实现一个简单的计算器功能

    在android中利用 studio实现一个简单的计算器功能 发布时间:2020-11-07 15:35:20 来源:亿速云 阅读:168 作者:Leah 这篇文章将为大家详细讲解有关在android ...

  9. java 分页 通用Mapper,在Spring4中使用通用Mapper

    1.在Spring4中使用通用Mapper Spring4增加了对泛型注入的支持,这个特性对通用Mapper来说,非常的有用,可以说有了这个特性,可以直接在Service中写Mapper mapper ...

最新文章

  1. 深入了解line-height
  2. hibernate基本映射文件
  3. 那些面试官,都是如何把候选人聊崩溃的
  4. mysql generic安装_MySQL 5.6 Generic Binary安装与配置
  5. Android RemoteController使用
  6. MySQL分组查询—添加分组后筛选
  7. Python 精简入门级学习(一)
  8. 著名程序员刘涛涛WinMount程序BUG
  9. jpype,jpython调用jar包中jdk的问题.
  10. bootchart.jar 编译过程
  11. ASP.Net七大内置对象 (整理的不错,转过来参考)
  12. 视觉SLAM笔记(62) 单目稠密重建
  13. 数据可视化基本套路总结
  14. json在线编辑器和解析库rapidjson试用
  15. C/C++编程学习 - 第17周 ② 数字统计
  16. 通过C语言实现二分查找法
  17. sql注入(三)绕过方法及防御手段
  18. 转自科学松鼠会------压缩感知的基础认识
  19. mysql字段长度计算
  20. JAVASE-17:集合Collection、List

热门文章

  1. ubuntu下搜索文件
  2. stringstream用法总结
  3. 图像处理算法打包成dll
  4. [云炬创业学笔记]第二章决定成为创业者测试17
  5. [云炬创业基础笔记]第十一章创业计划书测试14
  6. 科大星云诗社动态20201203
  7. 通俗解释优化的线性感知机算法:Pocket PLA
  8. 经典SQL语句大全 收藏
  9. 23种设计模式C++源码与UML实现--状态模式
  10. 一文读懂汇编程序的多个分段的程序--详解