QT中的元对象系统(二):创建自定义的QT类型
来源:互联网 发布:社区源码 编辑:程序博客网 时间:2024/05/01 16:50
原创文章,转载请注明出处,谢谢!
作者:清林,博客名:飞空静渡
原文:http://blog.csdn.net/fjb2080/archive/2009/12/10/4977342.aspx
我们在使用QT编程时,难免要定义自己需要的类型,但像QT自己的类型如QSzie、QString之类的,都是可以存储在QViriant中的,并且这些QT的类型是可以用在基于QObject类的类型属性中和基于信号和槽的发生机制中。
如果我们想要我们自己自定义的类型可以有QT自己类型的功能的话,我们就必须注册我们的类型到QT中,这样我们才可以在我们在信号和槽的通讯机制中使用我们的类型。
在我们想要把我们的类型注册到QT中,我们必须满足QMedaType类型的要求,这有三点是必须的要求(以后章节说的也要满足这三点要求)。
1、必须要有一个公有的构造函数。
2、必须要有一个公有的拷贝构造函数。
3、必须要有一个公有的虚构函数。
下面使用QT文档中的一个例子来说明:
第一步:我们首先可以定义一个满足上面三点要求的自定义的类。
第二步:注册我们的类型
我们的自定义的类型,在QT中的QVariant中的,因为在QVariant中并不知道怎么存储和获取我们的类型。因此我们就必须使我们的类型成为和QString一样的通用类型,这就需要QT中的QMetaType来完成了。我们需要调用Q_DECLARE_METATYPE这个宏来完成。
Q_DECLARE_METATYPE(Message);
这就可以使我们的Message可以存储在QVariant中了。Q_DECLARE_METATYPE可以使我们的类型使用在信号的参数中,但是直接使用在信号-槽的通讯中的,但不可以用在基于消息队列中的信号-槽的机制中的,例如我们在线程中的通讯,上面的那种定义就做不到了。这是因为,上面的那种定义是用宏来静态定义的,在QT中的元对象系统中并不知道在运行时怎么创建和销毁我们的自定义的对象。我将在后一章讲解我们自定义的类型完全用在信号-槽的通讯机制中的做法。
这是Message的实现代码:
最后看下我们的main函数。
我们在注册我们的Message类后,我们就可以使我们的Message类对象存储在我们的QVariant的对象中了。在main函数中,我们可以看到
QVariant stored;
stored.setValue(message);
而从QVariant中获得我们的对象可以这样:
Message retrieved = stored.value<Message>();
pro文件:
HEADERS = message.h
SOURCES = main.cpp /
message.cpp
下一章讲解用这个例子用在信号-槽的通讯机制中,后一章将讲解自定义类型在消息队列的信号-槽的机制,即在多线程通讯中使自定义类型在信号-槽中的运用。
- QT中的元对象系统(二):创建自定义的QT类型
- QT中的元对象系统(二):创建自定义的QT类型
- QT中的元对象系统(二):创建自定义的QT类型 收藏
- QT中的元对象系统(二):创建自定义的QT类型
- QT中的元对象系统(二):创建自定义的QT类型
- QT中的元对象系统(二):创建自定义的QT类型
- QT 中的元对象系统(二):创建自定义的QT类型
- QT中的元对象系统
- Qt中的元对象系统
- Qt中的元对象系统
- Qt中的元对象系统
- Qt的元对象系统
- Qt的元对象系统
- Qt的元对象系统
- qt 的元对象系统
- QT中的元对象系统 简介
- Qt元对象系统
- Qt元对象系统
- [转帖] linux 基本操作……(全部为个人的学习资料)
- [代码]访问内存中的XML元素和元素属性(LINQ to XML)
- windows的所有应用命令
- Mysql常用命令行大全
- 批量判断QQ是否在线,强迫聊天
- QT中的元对象系统(二):创建自定义的QT类型
- 黄色:办公室最佳色调
- [代码]获取XML元素的值(LINQ to XML)
- 雅虎网站页面性能优化的34条黄金守则
- 快速整合TOMCAT6.0.14+IIS6.0 不需要写什么注册表 将本人切身体会写出 希望可以帮到需要的人
- 语言的cgi编译全过程
- Microsoft Platform SDK Febrary 2003版下载,支持VC6
- IIS 配置性能优化
- struts2 spring整合注意事项。