简述

在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()相关推荐

  1. Qt中setData()和data()用法

    简述 最近在一个项目要到了setData()和data() 常见接口 1.**setdata()**存储数据 2.**data()**取出数据 单独存储 1.通过setData(),我们可以单独存储用 ...

  2. QT(Send raw data to printer)发送原始数据到USB打印机

    QT(Send raw data to printer)发送原始数据到USB打印机 http://hi.baidu.com/ppacctv/blog/item/c9517538a35ef3d2b211 ...

  3. 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 ...

  4. Qt三维图表模块 -- Data Visualization 学习记录

    Qt三维图表模块 ----- Data Visualization Qt数据可视化模块提供了一种将三维图形中的数据可视化为条形图.散点图和曲面图的方法.它对于可视化深度图和大量快速变化的数据特别有用, ...

  5. 2.关于QT中数据库操作,简单数据库连接操作,数据库的增删改查,QSqlTableModel和QTableView,事务操作,关于QItemDelegate 代理

     Linux下的qt安装,命令时:sudoapt-get install qt-sdk 安装mysql数据库,安装方法参考博客:http://blog.csdn.net/tototuzuoquan ...

  6. QT Basic 014 Model/View programming (模型、视图编程)

    前言:本文不是纯文本翻译,加入了对概念的理解,纯文本翻译,请看文后的一个链接. Model/View Programming Introduction to Model/View Programmin ...

  7. QT小游戏——中国象棋

    QT小游戏--中国象棋 前言 项目整体结构 棋子类 棋盘类 几个重要方法 1.坐标转化 2.移动规则 3.悔棋和撤销 项目文件 前言 最近用qt做了个中国象棋的小游戏. 目前只能左右互博,支持悔棋.效 ...

  8. QT绘制饼图+柱状图+折线图

    项目需要使用到不同的统计图案的方法来显示统计数据 包括:饼图.柱状图.折线图. 饼图的实现 具体实现代码如下: 首先需要一个QChartView来存放饼图,实现如下: 拖拽一个QGraphicsVie ...

  9. Qt信号与槽函数(QT二)

    目录 一.信号与槽函数 1.自定义槽函数 2.自定义信号 (1)信号声明 (2)自定义信号和发送例子 3.界面切换 (1)从firstWin -> secondWin 不需要返回 (2)从sec ...

最新文章

  1. 常见的java异常_浅谈十个常见的Java异常出现原因
  2. C++中STL和容器、迭代器、算法之间的关系
  3. ubantu 16.04 mysql_Ubuntu 16.04下安装MySQL
  4. MySQL高级 - like模糊匹配
  5. Java语法糖之foreach
  6. 为什么byte取值-128~127??
  7. HH SaaS电商系统的销售订单归档服务
  8. Ubuntu Server 分区案例
  9. LeetCode 524 通过删除字母匹配到字典里最长单词
  10. 国资委发文!10本书讲透数字化时代新机遇
  11. XCL-Charts圈图
  12. 转 基于.NET平台的分层架构实战
  13. WIN下静默安装MSI文件
  14. pcf8563c语言程序,IIC的PCF8563实用时钟程序(iccavr)
  15. USB接口PCB设计
  16. Swift — UIKit 之(8)—— 持久层|用户偏好设置
  17. NOI2002银河英雄传说——带权并查集
  18. 中国陷入超低生育率陷阱
  19. 上汽招聘项目管理PMO(地点:上海,薪酬面议)
  20. 【查找】临近省赛,Alan邀请emoji玩起了猜数字游戏活跃一下大脑。游戏规则如下:首先Alan写下几个数字让emoji猜,当emoji猜完之后,Alan会给他一个提示(java)

热门文章

  1. 感染新冠后为啥会丧失​嗅觉?最新《细胞》论文终于搞明白了!
  2. 图示不写程序如何根据dbSNP rs号批量获取基因组坐标、相关基因和表型影响
  3. 使用 Finder预览功能,让你可以快速浏览多个文件
  4. ps专业色彩调色扩展面板 Moody Photoshop Panel 1.1.2汉化版
  5. manga camera android,Manga-Camera
  6. 省选+NOI 第四部分 图论
  7. 提高篇 第三部分 图论 第4章 差分约束系统
  8. P1319 压缩技术(python3实现)
  9. 1268:【例9.12】完全背包问题
  10. php 定时缓存,php定时清理缓存文件的简单示例