Qt SLOT宏用作函数参数

时间:2014-03-15 04:07:35

标签: c++ qt qobject qt-signals moc

我正在浏览使用Qt 5.1.1安装的计算器示例,并且有一个私有函数用于创建按钮小部件(Button继承QToolButton):

Button *Calculator::createButton(const QString &text, const char *member)
{
    Button *button = new Button(text);
    connect(button, SIGNAL(clicked()), this, member);
    return button;
}

该示例调用上述函数创建几个不同的按钮,例如:

createButton(tr("Clear"), SLOT(clear()));

其中void clear()被声明为私有槽。我理解代码试图做什么,但我想知道为什么将SLOT(clear())作为const char *成员工作。我似乎无法在线找到可以解释使用SLOT的内容。

1 个答案:

答案 0 :(得分:1)

正如您在documentation of the connect method中看到的那样,函数签名需要const char *类型。这些是来自QtCore的相应定义:

Q_CORE_EXPORT const char *qFlagLocation(const char *method);
...
# define SLOT(a) qFlagLocation("1"#a QLOCATION)
# define SIGNAL(a) qFlagLocation("2"#a QLOCATION)

它有点复杂,您可以看到详细信息in here,但我为了解释和理解而对其进行了简化。

这种“旧的”信号槽语法基本上是基于“字符串”的,这也是它的基本缺陷。然而,这在Qt 5中已得到修复。它现在更接近您对问题的暗示,因此您宁愿将其视为函数或方法指针,因为您最终将此类元素传递给SLOT和SIGNAL moc标记。

为了完整性,相应的SIGNAL和SLOT令牌(即Q_SLOTS,Q_SIGNALS等)由元对象编译器处理,也就是说。 moc,它将它们放入“.moc”文件的方式。如果打开这些文件,您可以自己查看。有关更多详细信息,请查看可以找到的in here

的moc源代码