关于信号和位置,<代码>Q_OBJECT/code> 宏观在班级的声明中增加了一个虚拟功能qt_metabet(),该声明将在<代码>moc
后面界定。 (它还增加了一些转换声明,但此声明并不重要)。)
<代码>moc 然后,读到标题档案,看宏观时,它生成另一个<代码>.cpp文档,名称为moc_headerfilename.cpp
,其中包含对虚拟功能的定义,并询问你为什么可以删除提及<编码>签字:在您的主文档中,没有适当定义————信号。
So, when a signal is called, the definition from the mocfile is executed and QMetaObject::activate()
is called with the signal’s name and the signal’s arguments.
The activate()
function then figures out which connections have been established and fetches the names for the appropriate slots.
然后,它打电话到qt_metabet<>/code>,其中注明了位置名称和对信号和美容功能提出的论点,这些代表得到了一个大型<代码>switch
->>-对真实位置的说明。
由于在C++中没有关于信号和位置的实际名称的实时信息,如已经注意到的,这些信息将由以下编码编码编码编码:和>SLOT
简单const char*
的宏观编码(在名称上加上“1”或“2”来区别信号与位置)。
如下文所示:
#define SLOT(a) "1"#a
#define SIGNAL(a) "2"#a
——
<代码>Q_OBJECT 宏观法则界定了<代码>tr(>功能,可用于翻译您的申请。
Edit
As you asked what the qt_metacast
is doing. It checks whether an object belongs to certain class and if it does returns the pointer to it. If it doesn’t, it returns 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 *)
,例如,简单地检查遗产。