QVariant与自定义数据类型转换的方法

在使用VC、Delphi编写用户界面程序的时候,经常会把对象与控件的data域进行绑定,便于程序运行中读写提高效率。然而在Qt编程中怎么实现这个功能呢?比如将一个用户自定义的结构体与QComboBox控件的data绑定?

Qt的联机帮助做的实在是差强人意,示例代码太少了。调试了半天,看到这篇文章给了我提示。主要步骤如下:

1、将自定义数据类型使用Q_DECLARE_METATYPE宏进行声明,便于编译器识别。

2、在插入对象的时候,声明QVariant对象,使用其setValue方法添加自定义对象。

3、在读取的时候,采用QVariant对象的value方法返回自定义对象。

示例代码如下:

1、自定义结构体及元类型声明:

[cpp] view plaincopy

  1. struct MyStruct
  2. {
  3. int a;
  4. char b[10];
  5. };
  6. MyStruct stu;
  7. Q_DECLARE_METATYPE(MyStruct)

2、在程序初始化中,给结构体初始化并存储到QComboBox的data域中:

[cpp] view plaincopy

  1. bzero(&stu, sizeof(MyStruct)); //stu就是上面声明的全局变量
  2. //赋初值
  3. stu.a = 100;
  4. strcpy(stu.b,"Hello./n");
  5. //类型转换
  6. QVariant v;
  7. QString ss = QString("%1").arg(stu.b);
  8. v.setValue(stu);
  9. //保存到控件data中
  10. ui->cboTest->addItem(ss, v);
  11. ui->cboTest->addItem("aadkjf", 0);

3、读取的时候反过来处理,如下:

[cpp] view plaincopy

  1. QVariant v;
  2. //从控件data域取得variant对象
  3. v = ui->cboTest->itemData(0);
  4. //转换为自定义的结构体实例
  5. MyStruct s = v.value<MyStruct>();
  6. printf("value=%d:%s/n",s.a, s.b);
时间: 2024-11-24 20:52:47

QVariant与自定义数据类型转换的方法的相关文章

Struts2数据类型转换之自定义数据类型转换(二)

对于自定义的类型转换器来说,需要提供三个信息: Action的名字.Action中带转换的属性名.该属性对应的转换器类 其中,action的名字是通过属性文件名来获取的,action中待转换的属性名是通过文件中的key获得的,该属性对应的转换器类是通过该key对应的value获取的. 例如上节中的UserAction-converter.properties,其文件内容为: user=com.test.converter.UserConverter 这就告诉我们,对于UserAction这个ac

qsettings 保存自定义结构体(QVariant与自定义结构体相互转化)

参考博文:QVariant与自定义数据类型转换的方法. 这里摘取其关键内容: 1.将自定义数据类型使用Q_DECLARE_METATYPE宏进行声明,便于编译器识别. 2.在插入对象的时候,声明QVariant对象,使用其setValue方法添加自定义对象. 3.在读取的时候,采用QVariant对象的value方法返回自定义对象. 写入: //类型转换 QVariant v; v.setValue(MyStruct);  读取: //转换为自定义的结构体实例 MyStruct s = v.va

SpringMVC框架下数据的增删改查,数据类型转换,数据格式化,数据校验,错误输入的消息回显

在eclipse中javaEE环境下: 这儿并没有连接数据库,而是将数据存放在map集合中: 将各种架包导入lib下... web.xml文件配置为 <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/

语法》第九章 数据类型转换

第二部分  语法 ************第九章 数据类型转换 *************** JavaScript 是一种动态类型语言,变量没有类型限制,可以随时赋予任意值. 虽然变量没有类型,但是数据本身和各种运算符对运算子是有类型要求的.如果运算符发现,数据的类型与预期不符,就会自动转换类型.比如,减法运算符预期两侧的运算子应该是数值,如果不是,就会自动将它们转为数值. JS有一套数据类型自动转换的规则 一.强制转换 强制转换主要指使用Number.String和Boolean三个构造函数

Delphi 常见数据类型转换

不同的类有不同的成员,一般子类的成员是在父类的成员的后面增加了新的成员,如果子类转为父类,那这些新增加的成员虽然还存在,但是就不可以访问得到了.如果父类转为子类,那可能导致不可预知的错误,因为某个成员的指针指向的地址根本就不是具有实际成员.类型的转换也有很多类的,有隐性的和显性的,一些专用的类型转换函数,会重新建立一个新类型目标对象,然后把就类型的数值移动过去,然后销毁旧对象.一些隐性的转换,对象本身没改变,就把指针类型换一了一下.@用于取地址!最方便的用法:在调用Api的时候,举个例子:我们调

C#编程(四十一)----------用户定义的数据类型转换

用户定义的数据类型转换 C#允许定义自己的 数据类型,这意味着需要某些 工具支持在自己的数据类型间进行数据转换.方法是把数据类型转换定义为相关类的一个成员运算符,数据类型转换必须声明为隐式或者显式,以说明怎么使用它. C#允许用户进行两种定义的数据类型转换,显式和隐式,显式要求在代码中显式的标记转换,其方法是在原括号中写入目标数据类型. 对于预定义的数据类型,当数据类型转换时可能失败或者数据丢失,需要显示转换: 1.把int数值转换成short时,因为short可能不够大,不能包含转换的数值.

_01JavaSE基础_关键字、标识符、常量、进制、变量、注释、数据类型、数据类型转换

1.关键字: 被java赋予特定含义的单词 特点: 全部小写 注意事项: goto和const作为保留字存在 2.标识符: 给类.接口.方法.变量等起名的字符序列 组成规则: a.英文大小写字母 b.数字字符(0-9) c.$和_ 注意事项: a.不能以数字开头 b.不能是java中的关键字 c.区分大小写 常见命名规则: a.包: 单级:全部小写 举例:liuyi,com 多级:全部小写,单词与单词之间用"."隔开 举例:cn.itcast,com.baidu b.类名及接口名: 每

Javascript中数据类型转换那些事

在js中,总的来说数据类型分为两大类,一类是原始值类型的,一类是引用类型的.原始值类型的包括:字符串(String) .数字(Number) .布尔值(Boolean) 以及两个特殊的值 null 和 undefined .引用类型的主要是指对象,在js中,对象的范围很广,甚至有js中一切都是对象这样的说法.对象可以分为 对象(Object) 以及更具体的数组(Array) . 函数(Function) 等类型.要注意的是,js中typeof运算符返回的类型只有:sting.number.boo

Echarts 地图(map)插件之 鼠标HOVER和tooltip自定义数据

在项目开发中,有需要用到地图的地方,百度的echarts地图插件就是个不错的选择, 这里总结一下地图自定义鼠标HOVER时的事件和自定义tooltip数据: 一.鼠标HOVER时的事件: 参照官方文档解释, 可以看出这款插件有丰富的鼠标事件可供选择: 调用鼠标HOVER事件的方法很简单,只需把以下代码放到charts()调用的函数的最底部即可 1 var ecConfig = require('echarts/config'); 2 myChart.on(ecConfig.EVENT.HOVER