qt setData()和data()
简述
在GUI开发中,往往需要在界面中存储一些有用的数据,这些数据可以来自配置文件、注册表、数据库、或者是Server。
无论来自哪里,这些数据对于用户来说都是至关重要的,它们在交互过程中大部分都会被用到,例如:单击一个用户头像,显示该用户的详细信息(等级、昵称、姓名、个人说明)。
常见接口
Qt中,可以通过绝大部分已有的接口来存数数据、获取数据。例如:
存储数据
- setData()
- setItemData()
- setUserData()
获取数据:
- data()
- itemData()
- userData()
常用的基本就这些,当然,还有其他的一些接口。。。
数据源
为了便于演示,我们定义两个数据源:结构体User、枚举LANGUAGE。
// 用户信息
struct User : QObjectUserData {int nID; // IDQString strName; // 用户名
};// 语言
typedef enum{UI_ZH, // 中文UI_EN // 英文
} LANGUAGE;Q_DECLARE_METATYPE(User)
Q_DECLARE_METATYPE(LANGUAGE)
其中,User定义为QObjectUserData类型,为了后面setUserData()和userData()使用。如果不使用这两个接口,则不需要定义为QObjectUserData。
绝大部分存储用户数据的接口都使用的是QVariant,也就是我们常说的“万能变量”。对于自定义数据类型,如果要使用QVariant,就必须使用Q_DECLARE_METATYPE注册。
setData()和data()
创建一个QListWidget列表,添加5个Item项,然后给每一个都存储属于自己的数据。
单独存储
通过setData(),我们可以单独存储用户数据,使用Qt::UserRole、Qt::UserRole + 1……
QListWidget *pListWidget = new QListWidget(this);
int i = 0;
do {++i;QListWidgetItem *pItem = new QListWidgetItem(pListWidget);pItem->setData(Qt::UserRole, i); // 用户数据pItem->setData(Qt::UserRole + 1, QString("Qter %1").arg(i)); // 用户数据pItem->setText(QString("Item %1").arg(i)); // 文本pListWidget->addItem(pItem);
} while (i < 5);// 连接信号槽
connect(pListWidget, &QListWidget::itemClicked, this, &MainWindow::onItemClicked);
槽函数,获取用户数据,执行相应操作。
void onItemClicked(QListWidgetItem *item) {int nID = item->data(Qt::UserRole).toInt(); // 获取用户数据QString strName = item->data(Qt::UserRole + 1).toString(); // 获取用户数据qDebug() << "ID : " << nID;qDebug() << "Name : " << strName;
}
整体存储
也可以通过setData()进行整体存储,这时候只需要使用Qt::UserRole即可,把用户数据当成一个结构体来存储。
QListWidget *pListWidget = new QListWidget(this);
int i = 0;
do {++i;QListWidgetItem *pItem = new QListWidgetItem(pListWidget);User user;user.nID = i;user.strName = QString("Qter %1").arg(i);pItem->setData(Qt::UserRole, QVariant::fromValue(user)); // 设置用户数据pItem->setText(QString("Item %1").arg(i));pListWidget->addItem(pItem);
} while (i < 5);
槽函数,获取用户数据,执行相应操作。
void onItemClicked(QListWidgetItem *item) {QVariant variant = item->data(Qt::UserRole); // 获取用户数据User user = variant.value<User>();qDebug() << "ID : " << user.nID;qDebug() << "Name : " << user.strName;
}
无论那种方式都可以,如果在信号和槽的传递过程中,参数过多,建议使用“整体存储”方式。
setItemData()和itemData()
在Qt之国际化一节中,分享了多语言的切换,下面就以此为例:
QComboBox *pComboBox = new QComboBox(this);
pComboBox->addItem("Chinese");
pComboBox->addItem("English");
pComboBox->setItemData(0, QVariant::fromValue(UI_ZH)); // 设置用户数据
pComboBox->setItemData(1, QVariant::fromValue(UI_EN)); // 设置用户数据// 连接信号槽
connect(pComboBox, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &MainWindow::onCurrentIndexChanged);
槽函数,获取用户数据,执行相应操作。
void onCurrentIndexChanged(int index) {// 获取发送者QObject *pObject = this->sender();QComboBox *pComboBox = qobject_cast<QComboBox *>(pObject);// 获取用户数据QVariant variant = pComboBox->itemData(index);LANGUAGE language = variant.value<LANGUAGE>();qDebug() << "Language : " << language;
}
setUserData()和userData()
通过setUserData(),我们可以存储用户数据。
注意:用户数据需要被定义为QObjectUserData类型。
QPushButton *pButton = new QPushButton(this);
pButton->setText("Qter");// 用户数据
User *pUser = new User();
pUser->nID = 1;
pUser->strName = "Qter";pButton->setUserData(Qt::UserRole, pUser); // 设置用户数据// 连接信号槽
connect(pButton, &QPushButton::clicked, this, &MainWindow::onClicked);
槽函数,获取用户数据,执行相应操作。
void onClicked() {// 获取发送者QObject *pObject = this->sender();QPushButton *pButton = qobject_cast<QPushButton *>(pObject);// 获取用户数据User *pUser = (User *)(pButton->userData(Qt::UserRole));qDebug() << "ID : " << pUser->nID;qDebug() << "Name : " << pUser->strName;
}
通过userData()可以获取QObjectUserData数据,然后转换成我们需要的类型User。
自定义数据
用现有的接口固然方便,有时对于复杂的功能,我们也不得不自定义。
举一个简单的例子:
#include <QPushButton>class PushButton : public QPushButton
{Q_OBJECTpublic:explicit PushButton(QWidget *parent = 0): QPushButton (parent),m_nID(-1),m_strName(""){}void setID(int id) {m_nID = id;}void setName(QString name) {m_strName = name;}int id() const {return m_nID;}QString name() const {return m_strName;}private:int m_nID;QString m_strName;};
我们定义了一个按钮QPushButton,可以通过setID()、setName()来设置ID和名称信息,如果要获取信息,则可以调用id()、name()函数。
使用很简单:
PushButton *pButton = new PushButton(this);
pButton->setText("Qter");// 设置自定义数据
pButton->setID(1);
pButton->setName("Qter");// 连接信号槽
connect(pButton, &QPushButton::clicked, this, &MainWindow::onClicked);
槽函数,获取用户数据,执行相应操作。
void onClicked() {// 获取发送者QObject *pObject = this->sender();PushButton *pButton = qobject_cast<PushButton *>(pObject);// 获取用户数据qDebug() << "ID : " << pButton->id();qDebug() << "Name : " << pButton->name();
}
基本的数据存储与获取方式就这些,以后会经常用到,Good luck。
qt setData()和data()相关推荐
- Qt中setData()和data()用法
简述 最近在一个项目要到了setData()和data() 常见接口 1.**setdata()**存储数据 2.**data()**取出数据 单独存储 1.通过setData(),我们可以单独存储用 ...
- QT(Send raw data to printer)发送原始数据到USB打印机
QT(Send raw data to printer)发送原始数据到USB打印机 http://hi.baidu.com/ppacctv/blog/item/c9517538a35ef3d2b211 ...
- qt android meta data,Qt小技巧5.解决Failed to extract plugin meta data问题
使用Qt插件开发时,在debug模式下加载插件时遇到如下问题: "Failed to extract plugin meta data from './ICE-PCPUd. dll'&quo ...
- Qt三维图表模块 -- Data Visualization 学习记录
Qt三维图表模块 ----- Data Visualization Qt数据可视化模块提供了一种将三维图形中的数据可视化为条形图.散点图和曲面图的方法.它对于可视化深度图和大量快速变化的数据特别有用, ...
- 2.关于QT中数据库操作,简单数据库连接操作,数据库的增删改查,QSqlTableModel和QTableView,事务操作,关于QItemDelegate 代理
Linux下的qt安装,命令时:sudoapt-get install qt-sdk 安装mysql数据库,安装方法参考博客:http://blog.csdn.net/tototuzuoquan ...
- QT Basic 014 Model/View programming (模型、视图编程)
前言:本文不是纯文本翻译,加入了对概念的理解,纯文本翻译,请看文后的一个链接. Model/View Programming Introduction to Model/View Programmin ...
- QT小游戏——中国象棋
QT小游戏--中国象棋 前言 项目整体结构 棋子类 棋盘类 几个重要方法 1.坐标转化 2.移动规则 3.悔棋和撤销 项目文件 前言 最近用qt做了个中国象棋的小游戏. 目前只能左右互博,支持悔棋.效 ...
- QT绘制饼图+柱状图+折线图
项目需要使用到不同的统计图案的方法来显示统计数据 包括:饼图.柱状图.折线图. 饼图的实现 具体实现代码如下: 首先需要一个QChartView来存放饼图,实现如下: 拖拽一个QGraphicsVie ...
- Qt信号与槽函数(QT二)
目录 一.信号与槽函数 1.自定义槽函数 2.自定义信号 (1)信号声明 (2)自定义信号和发送例子 3.界面切换 (1)从firstWin -> secondWin 不需要返回 (2)从sec ...
最新文章
- 常见的java异常_浅谈十个常见的Java异常出现原因
- C++中STL和容器、迭代器、算法之间的关系
- ubantu 16.04 mysql_Ubuntu 16.04下安装MySQL
- MySQL高级 - like模糊匹配
- Java语法糖之foreach
- 为什么byte取值-128~127??
- HH SaaS电商系统的销售订单归档服务
- Ubuntu Server 分区案例
- LeetCode 524 通过删除字母匹配到字典里最长单词
- 国资委发文!10本书讲透数字化时代新机遇
- XCL-Charts圈图
- 转 基于.NET平台的分层架构实战
- WIN下静默安装MSI文件
- pcf8563c语言程序,IIC的PCF8563实用时钟程序(iccavr)
- USB接口PCB设计
- Swift — UIKit 之(8)—— 持久层|用户偏好设置
- NOI2002银河英雄传说——带权并查集
- 中国陷入超低生育率陷阱
- 上汽招聘项目管理PMO(地点:上海,薪酬面议)
- 【查找】临近省赛,Alan邀请emoji玩起了猜数字游戏活跃一下大脑。游戏规则如下:首先Alan写下几个数字让emoji猜,当emoji猜完之后,Alan会给他一个提示(java)
热门文章
- 感染新冠后为啥会丧失​嗅觉?最新《细胞》论文终于搞明白了!
- 图示不写程序如何根据dbSNP rs号批量获取基因组坐标、相关基因和表型影响
- 使用 Finder预览功能,让你可以快速浏览多个文件
- ps专业色彩调色扩展面板 Moody Photoshop Panel 1.1.2汉化版
- manga camera android,Manga-Camera
- 省选+NOI 第四部分 图论
- 提高篇 第三部分 图论 第4章 差分约束系统
- P1319 压缩技术(python3实现)
- 1268:【例9.12】完全背包问题
- php 定时缓存,php定时清理缓存文件的简单示例