gpt4 book ai didi

qt - Qt是如何实现信号和槽的?

转载 作者:行者123 更新时间:2023-12-03 20:28:20 25 4
gpt4 key购买 nike

有人可以向我解释 Qt 信号和插槽机制实现的基本思想吗?
我想知道所有那些 Q_OBJECT 宏在“纯 C++”中做了什么。
这个问题与信号和插槽的使用无关。

添加:
我知道 Qt 使用 moc 编译器将 Qt-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然后读取头文件,当它看到宏时,它会生成另一个 .cpp文件名为 moc_headerfilename.cpp有了虚函数的定义,你可能会问自己为什么不提 signals:在没有正确定义的头文件中 - 信号。

因此,当调用信号时,将执行 mocfile 中的定义并执行 QMetaObject::activate()使用信号的名称和信号的参数调用。activate()函数然后确定哪些连接已建立并获取适当插槽的名称。

然后它调用 qt_metacall使用给信号的槽名称和参数,元调用函数在大 switch 的帮助下委托(delegate)它。 — case声明到真正的插槽。

由于在 C++ 中没有关于信号和槽的实际名称的真正运行时信息,正如已经注意到的,这些将由 SIGNAL 编码。和 SLOT简单的宏const char* s(在名称中添加“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 *) 中调用例如,简单地检查继承。

关于qt - Qt是如何实现信号和槽的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2008033/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com