qt setData()和data()
简述
在GUI开发中,往往需要在界面中存储一些有用的数据,这些数据可以来自配置文件、注册表、数据库、或者是Server。
无论来自哪里,这些数据对于用户来说都是至关重要的,它们在交互过程中大部分都会被用到,例如:单击一个用户头像,显示该用户的详细信息(等级、昵称、姓名、个人说明)。
常见接口
Qt中,可以通过绝大部分已有的接口来存数数据、获取数据。例如:
存储数据
- setData()
- setItemData()
- setUserData()
获取数据:
- data()
- itemData()
- userData()
常用的基本就这些,当然,还有其他的一些接口。。。
数据源
为了便于演示,我们定义两个数据源:结构体User、枚举LANGUAGE。
// 用户信息
struct User : QObjectUserData {
int nID; // ID
QString 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_OBJECT public:
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();
}
基本的数据存储与获取方式就这些.
https://blog.csdn.net/swartz_lubel/article/details/55195509
qt setData()和data()的更多相关文章
- Qt之QTableView添加复选框(QAbstractTableModel)
简述 使用QTableView,经常会遇到复选框,要实现一个好的复选框,除了常规的功能外,还应注意以下几点: 三态:不选/半选/全选 自定义风格(样式) 下面我们介绍一下常见的实现方式: 编辑委托. ...
- Qt之界面数据存储与获取(使用setUserData()和userData())
在GUI开发中,往往需要在界面中存储一些有用的数据,这些数据可以来配置文件.注册表.数据库.或者是server. 无论来自哪里,这些数据对于用户来说都是至关重要的,它们在交互过程中大部分都会被用到,例 ...
- qt超强精美绘图控件 - QCustomPlot一览 及 安装使用教程
1.概述 QCustomPlot 是一个超强超小巧的qt绘图类,非常漂亮,非常易用,只需要加入一个qcustomplot.h和qcustomplot.cpp文件即可使用,远比qwt方便和漂亮,可以自己 ...
- 2.大约QT数据库操作,简单的数据库连接操作,增删改查数据库,QSqlTableModel和QTableView,事务性操作,大约QItemDelegate 代理
Linux下的qt安装,命令时:sudoapt-get install qt-sdk 安装mysql数据库,安装方法參考博客:http://blog.csdn.net/tototuzuoquan ...
- 2.关于QT中数据库操作,简单数据库连接操作,数据库的增删改查,QSqlTableModel和QTableView,事务操作,关于QItemDelegate 代理
Linux下的qt安装,命令时:sudoapt-get install qt-sdk 安装mysql数据库,安装方法参考博客:http://blog.csdn.net/tototuzuoquan ...
- PyQt(Python+Qt)学习随笔:QTableWidgetItem项的复选状态checkState访问方法
老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 QTableWidget表格部件中的QTableWidgetItem项可以单独设置复选状态,如图所有 ...
- C/C++ Qt MdiArea 多窗体组件应用
MDI多窗体组件,主要用于设计多文档界面应用程序,该组件具备有多种窗体展示风格,其实现了在父窗体中内嵌多种子窗体的功能,使用MDI组件需要在UI界面中增加mdiArea控件容器,我们所有的窗体创建与操 ...
- Intent属性详解三 data、type和extra
1 Data 执行时要操作的数据 在目标<data/>标签中包含了以下几种子元素,他们定义了url的匹配规则: android:scheme 匹配url中的前缀,除了“http”.“ht ...
- Qt Creator调试
与调试器交互的几种方法: 1.单行运行或者单指令运行 2.中断程序运行 3.设置断点 4.检查调用栈空间的内容 5.检查并修改局部或者全局变量 6.检查并修改被调试程序的寄存器和内存内容 7.检查装载 ...
随机推荐
- 让Netty入门变得简单
让Netty入门变得简单 https://mp.weixin.qq.com/s/MBnbLmCmFJo0QK9WNwXrXQ 如果先启动nettyClient就不会有nettyServer输出了: p ...
- Python——管理属性(1)
管理属性 这里将展开介绍前面提到的[属性拦截]技术.包含下面内容: [1]__getattr__和__setattr__方法.把没有定义的属性获取和全部的属性赋值指向通用的处理器方法 [2]__get ...
- 【Project Euler 8】Largest product in a series
题目要求是: The four adjacent digits in the 1000-digit number that have the greatest product are 9 × 9 × ...
- 使用javascript开发的视差滚动效果的云彩
在线演示 jquery.parallax.js是一款能够帮助你快速开发视差效果的jQuery插件,在这里我们使用它来开发一款漂亮的云朵视差效果. 主要代码: Javascript ........ 阅 ...
- Samba简单教程+Samba中文显示问题
1.检测安装Samba服务(1).检查Samba服务包是否已安装:rpm -qa | grep samba(2).如未安装,则插入第一张安装盘,执行:mount /mnt/cdromcd /cdrom ...
- C# 实现对微博短网址的重定向还原
新浪微博中,为了节省输入字数,通过短网址对发布微博中链接进行重定向.我们可以通过代码实现对短网址进行还原,代码如下: private string GetOrignalLink(string link ...
- Unable to create requested service org.hibernate.cache.spi.RegionFactory
hibernate 4.3.11+struts2.3.28.1+spring 4.2.5,在搭框架的时候,报的这个错误: Unable to create requested service org. ...
- 微信小程序 - wx:key
看官方源码以及代码示例: 示例官网:列表渲染wx:key 官方原话 如果列表中项目的位置会动态改变或者有新的项目添加到列表中,并且希望列表中的项目保持自己的特征和状态(如 <input/> ...
- 算法笔记_153:算法提高 判断名次(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 某场比赛过后,你想要知道A~E五个人的排名是什么,于是要求他们每个人说了一句话.(经典的开头……-_-!)得了第1名的人23,说了假话:得 ...
- cocos2d-x CCScrollView 源代码分析
版本号源代码来自2.x,转载请注明 另我实现了能够循环的版本号http://blog.csdn.net/u011225840/article/details/31354703 1.继承树结构 能够看出 ...