Qt的元对象(Meta-Object)系统简介(转)

Qt的元对象系统基于如下三件事情:

 

1.类:QObject,为所有需要利用原对象系统的对象提供了一个基类。

2.宏:Q_OBJECT,通常可以声明在类的私有段中,让该类可以使用元对象的特性,比如动态属性,信号和槽。

3.编译器:元对象编译器(moc)为每个QObject子对象自动生成必要的代码来实现元对象特性。

moc工具会读入C++的源文件,如果它发现了一个或者多个声明了Q_OBJECT宏的类,它就创建另一个C++源文件,为每个类生成包含元对象实现的代码。这些编译生成的源文件通常都已经被包含到类的源文件中或者和类的实现同时被编译和链接。

 

除了为对象间的通信提供信号和槽(signals and slots)机制之外,元对象的代码还提供下列特性:

·QObject::metaObject()返回与该类绑定的meta-object对象。

·QMetaObject::className()可以在运行时以字符串的形式返回类的名字,不需要C++编译器原生的运行时类型信息(RTTI)的支持。

·QObject::inherits()函数返回继承信息:对象是否是QObject继承树上一个类的实例。

·QObject::tr()和QObject::trUtf8()提供国际化支持,将字符串翻译成指定的语言。

·QObject::setProperty()和QObject::property()通过名字动态设置和获取对象属性。

·QMetaObject::newInstance()构造该类的一个新实例。

除此之外你还可以用qobject_cast()动态转换QObject类的类型。qobject_cast()函数和标准C++的dynamic_cast()功能类似,只是其不需要RTTI的支持,而且可以跨越动态连接库的边界。它尝试将它的参数cast成尖括号内的对象类型,如果对象是正确的类型(运行时决定)则返回非零,否则返回0,说明对象类型不兼容。

当某一个Object emit一个signal的时候,它就是一个sender,系统会记录下当前是谁emit出这个signal的,所以你在对应的slot里就可以通过sender()得到当前是谁invoke了你的slot,对应的是QObject->d->sender。
    有可能多个Object的signal会连接到同一个signal(例如多个Button可能会connect到一个slot函数onClick()),因此这是就需要判断到底是哪个Object emit了这个signal,根据sender的不同来进行不同的处理。这时就要用到qobject_cast()。

 

例如,假设MyWidget继承自QWidget,同时也声明了Q_OBJECT宏,

          QObject *obj = new MyWidget;

QObject类型的变量obj实际上指向一个MyWidget对象,因此我们可以这样进行类型转换:

          QWidget *widget = qobject_cast<QWidget *>(obj);

到MyWidget的转型可以成功是因为qobject_cast()并没有对Qt内建对象和定制的扩展对象分别对待。

          QLabel *label = qobject_cast<QLabel *>(obj);     // label is 0

另一方面到QLabel的转型则会失败,指针会被设置为0。这样使得我们可以在运行时根据对象类型,对不同类型的对象进行不同的处理:

   if (QLabel *label = qobject_cast<QLabel *>(obj))

{       label->setText(tr("Ping"));   }

 else  if (QPushButton *button = qobject_cast<QPushButton *>(obj))

{      button->setText(tr("Pong!"));   }

尽管我们可以在不用Q_OBJECT宏和原对象信息的情况下仍旧使用QObject作为基类,但是像信号和槽以及其他这里描述的特性将无法使用。从元对象系统的观点来看,一个没有元对象代码的QObject子类和其最接近的有元对象代码的祖先是等同的。这也就意味着,QMetaObject::className()将不会返回你的类的真实的名字,而是该类某一个祖先的名字。

因此,我们强烈建议所QObject的子类都是用Q_OBJECT宏,不管你实际上是否使用信号和槽,以及属性。

 

例子:

connect(pushButton_2,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked())); 
connect(pushButton,SIGNAL(clicked()),this,SLOT(on_pushButton_clicked()));

void MainWindow::on_pushButton_clicked() 
{
  QPushButton*pt=qobject_cast <QPushButton*>(sender());

if(!pt)

return; 
  QString str;

if (pt = = pushButton) 
        str="1";

else  if (pt = = pushButton_2) 
         str="2"; 
  } 

转载于:https://www.cnblogs.com/qq78292959/archive/2012/08/20/2648099.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/262463.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

回归测试的策略

回归测试是贯穿在整个测试的各个阶段的一个测试活动。它的目的是检验已经被发现的缺陷有没有被正确的修改和修改过程中有没有引发新的缺陷。软件在测试或者其他活动中发现的缺陷经过修改后&#xff0c;都要进行回归测试的验证。在做回归测试的时候可以采用不同的策略。 策 略&a…

Meteor创建示例项目 Simple-todos

2019独角兽企业重金招聘Python工程师标准>>> 本笔记&#xff0c;基于Windows环境。 1、Meteor提供了一些示例项目供开发者参考&#xff0c;打开命令行&#xff0c;输入meteor create --list 可以查看提供了哪些示例项目 2、通过meteor create --example <project…

RHEL6下squid代理之正向代理

Squid cache&#xff08;简称为Squid&#xff09;是一个流行的自由软件&#xff08;GNU通用公共许可证&#xff09;的代理服务器和Web缓存服务器。Squid有广泛的用途&#xff0c;从作为网页服务器的前置cache服务器缓存相关请求来提高Web服务器的速度&#xff0c;到为一组人共享…

ASP.NET 使用 X509Certificate2 系统找不到指定的文件

经过虚拟机里面每个用户权限的剥离和对比&#xff0c;最后发现必须要USER的读取权限才能访问证书&#xff01;转载于:https://www.cnblogs.com/zjoch/archive/2009/06/19/1506399.html

跨平台Markdown编辑软件Typora mac功能介绍

Typora mac是一款跨平台的Markdown编辑器&#xff0c;支持Windows、MacOS和Linux操作系统。它具有实时预览功能&#xff0c;能够自动将Markdown文本转换为漂亮的排版效果&#xff0c;让用户专注于写作内容而不必关心格式调整。Typora Mac版除了支持常见的Markdown语法外&#x…

linux精简、备份还原、iso文件、批量安装?

最近小组需要批量自动部署一批机器&#xff0c;把Linux和自己的应用一次批量安装完&#xff0c;每次克隆硬件有点麻烦&#xff0c;因此查了一下相关的资料&#xff0c;看那种方案最好&#xff0c;整理如下。不过没有找到类似windows那样的ghost盘安装的形式&#xff0c;不知网友…

内存总结

(1)lru_file_repage: 当 lru_file_repage 可调参数设置为 1 时&#xff0c;AIX 内核使用这个重新分页信息来确定是否仅选择非计算性的分页进行操作、或者选择计算性的和非计算性的分页进行操作。如果计算性分页的重新分页速度比非计算性分页的重新分页速度高&#xff0c;那么…

如何解决 SQL Server 安装程序中的 COM+ 系统配置检查失败问题

转载自&#xff1a;http://technet.microsoft.com/zh-cn/library/ms143690(SQL.90).aspxSQL Server 2005 联机丛书&#xff08;2008 年 11 月&#xff09;如何解决 SQL Server 安装程序中的 COM 系统配置检查失败问题Microsoft SQL Server 2005 安装程序检查 COM 是否已正确配置…

mysql decimal(6_MySQL(六) decimal数据默认处理

create table decimal_test(id int auto_increment PRIMARY key,score decimal(5,2) -- 取值范围是 -999.99 到 999.99);decimal(M,D)M整数位小数位-- 整数的位数必须小于等于m-d&#xff0c;不然报错。小数的位数可以大于d位。多出d位时会做四舍五入&#xff0c;截取到d位。--…

读取记事本内容,自动发布到新浪微博

想把自己博客上的内容同步到新浪微博上&#xff0c;虽然新浪微博已经提供了关联博客的功能&#xff0c;但那仅限于新发布的微博内容。 手工一条条发布呢&#xff0c;实在枯燥&#xff0c;就想到新浪微博的api接口&#xff0c;结果第一个版本现在已经停止申请了&#xff0c;第二…

Objective-C Runtime 运行时之五:协议与分类

Objective-C中的分类允许我们通过给一个类添加方法来扩充它&#xff08;但是通过category不能添加新的实例变量&#xff09;&#xff0c;并且我们不需要访问类中的代码就可以做到。 Objective-C中的协议是普遍存在的接口定义方式&#xff0c;即在一个类中通过protocol定义接口&…

sqlserver中在建立与服务器的连接时出错

解决&#xff1a;步骤1&#xff1a;在SQLServer 实例上启用远程连接1.指向“开始->程序->Microsoft SQL Server 2005->配置工具->SQL Server 外围应用配置器”2.在“SQL Server 2005 外围应用配置器”页, 单击“服务和连接的外围应用配置器”3.然后单击展开“数据库…

mysql 热备 windows_windows下mysql热备

A: mysql> Grant replication slave on *.* to backup10.16.0.233 identified by 1234; *结尾分号要打代表确认B: mysql> Grant replication slave on *.* to backup10.16.0.231 identified by 1234&#xff1b;注&#xff1a; (1). mysql> Grant 权限 on *.* to 用户…

【转】PB实现在通知区域添加图标

“为应用程序在任务栏通知区域加个图标&#xff0c;按最小化控制菜单后隐藏窗口&#xff0c;单击通知区域内的图标恢复并显示窗口&#xff0c;右击通知区域内的图标弹出快捷方式菜单”&#xff0c;已成为时下程序设计上的一个时髦主题&#xff0c;有不少文章介绍了如何实现&…

[LeetCode]题解(python):058-Length of Last Word

题目来源&#xff1a; https://leetcode.com/problems/length-of-last-word/ 题意分析&#xff1a; 给出只包括大小写和空格的字符&#xff0c;输出最后一个单词的长度。 题目思路&#xff1a; 从最后一个字符开始搜索&#xff0c;如果字符非空格&#xff0c;则往前推一位&…

Oracle新手笔记(2) 关于Oracle 9i或9i以上版本客户端连接Oracle 8i及8i版本以下服务器端中文字符乱码的解决办法...

在做项目过程中&#xff0c;遇到Oracle 9i或9i版本以上客户端连接Oracle 8i及8i版本以下服务器端时&#xff0c;查询出来的中文数据全部变成了乱码。经查询资料终于解决了乱码问题。 开发工具是ASP.NET&#xff08;C#&#xff09; Oracle&#xff0c;使用System.Data.OracleCli…

mysql 5.7安装教程linux_Mysql5.7 Linux安装教程

1系统约定安装文件下载目录&#xff1a;/data/softwareMysql目录安装位置&#xff1a;/usr/local/mysql数据库保存位置&#xff1a;/data/mysql日志保存位置&#xff1a;/data/log/mysql执行如下命名&#xff1a;#mkdir /data/software#cd /data/software--下载安装包--建议&am…

如何将MATLAB程序发布为独立的不依赖MATLAB环境可执行的程序包(基于Matlab R2015b版 )

如何将MATLAB程序发布为独立的不依赖MATLAB环境可执行的程序包&#xff08;基于MatlabR2015b版&#xff09; 关键字&#xff1a;MatlabR2015b,可独立运行,可脱离Matlab环境,m文件,Matlab程序 如何将MATLAB程序.m文件发布为独立的不依赖MATLAB环境可执行的程序包。本文演示了基于…

[C#]利用键代码自动转换生成字母键或其它键信息

先上图说明目的&#xff1a; 有时需要将A到Z&#xff08;或更多的键盘信息&#xff09;放到一个组合框或其它控件中&#xff0c;可以用循环语句轻松搞定&#xff1a; using System.Collections .ObjectModel ;//引用泛型数组空间 namespace mouseclick1{ //返回26个字母的泛…

互联网产品跨部门沟通的10个原则(转)

摘要: 向对方重复沟通中的主要内容&#xff1b;利用澄清的方式提出不明白的内容&#xff1b;谈论重点议题时尽量不要打断对方讲话&#xff1b;对产品经理来说&#xff0c;跨部门沟通不良&#xff0c;可能会让他好不容易建立起来的自信瞬间摧毁。 你认为十万火急的事&#xff0c…