Qt如何实现信号和插槽?

栏目: 编程工具 · 发布时间: 6年前

内容简介:http://stackoverflow.com/questions/2008033/how-does-qt-implement-signals-and-slots

有人可以向我解释Qt信号和插槽机制的基本思路吗?

我想知道所有这些Q_OBJECT宏在普通C中做什么.

这个问题不是关于信号和插槽的使用.

添加:

我知道Qt使用moc编译器来将Ct-C转换成C类.

但是moc做什么?

我试图阅读“moc_filename.cpp”文件,但我不知道这可能是什么意思

void *Widget::qt_metacast(const char *_clname)
{
if (!_clname) return 0;
if (!strcmp(_clname, qt_meta_stringdata_Widget))
    return static_cast<void*>(const_cast< Widget*>(this));
return QDialog::qt_metacast(_clname);
}

提前致谢,

安东

关于信号和插槽,Q_OBJECT宏将虚函数qt_metacall()声明添加到类的声明中,该声明将由moc稍后定义. (它还添加了一些转换声明,但这在这里并不重要.)

然后,moc读取头文件,当它看到宏时,它会生成另一个名为moc_headerfilename.cpp的.cpp文件,其中包含虚拟函数的定义,您可能会问自己为什么可以提及这些信号:在头文件没有正确的定义 – 信号.

因此,当一个信号被调用时,将执行mocfile中的定义,并使用信号的名称和信号的参数调用QMetaObject :: activate().

然后,activate()函数确定已经建立了哪些连接,并获取相应插槽的名称.

然后,它会使用插槽名称和给信号的参数调用qt_metacall,而metacall函数将这个大型switch-case语句的帮助委托给真实插槽.

由于C中没有关于信号和时隙的实际名称的真实运行时间信息,如已经被注意到的那样,这些信号将被SIGNAL和SLOT宏编码为简单的const char *(具有“1”或“ 2“添加到名称以区分信号与插槽).

如在qobjectdefs.h中定义的:

#define SLOT(a)     "1"#a
#define SIGNAL(a)   "2"#a

Q_OBJECT宏所做的另一件事就是定义对象内的tr()函数,可以用来翻译你的应用程序.

编辑

当你问qt_metacast在做什么它检查对象是否属于某个类,如果它返回指向它的指针.如果没有,则返回0.

Widget* w = new Widget();
Q_ASSERT(w->qt_metacast("Widget") != 0);
Q_ASSERT(w->qt_metacast("QWidget") != 0);
Q_ASSERT(w->qt_metacast("QObject") != 0);
Q_ASSERT(w->qt_metacast("UnrelatedClass") == 0);

这是需要提供一些不可能的运行时反射.例如,该函数在 QObject::inherits(const char *) 中调用,只需检查继承.

http://stackoverflow.com/questions/2008033/how-does-qt-implement-signals-and-slots


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Web Security Testing Cookbook

Web Security Testing Cookbook

Paco Hope、Ben Walther / O'Reilly Media / 2008-10-24 / USD 39.99

Among the tests you perform on web applications, security testing is perhaps the most important, yet it's often the most neglected. The recipes in the Web Security Testing Cookbook demonstrate how dev......一起来看看 《Web Security Testing Cookbook》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码