2

我正在浏览与 Qt 5.1.1 一起安装的计算器示例,并且有一个用于创建按钮小部件的私有函数(按钮继承 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 *member 工作。我似乎在网上找不到太多可以解释使用 SLOT 的东西。

4

1 回答 1

1

正如您在connect 方法的文档中看到的那样,函数签名需要 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)

它有点复杂,您可以在此处查看详细信息,但为了解释和理解,我对其进行了简化。

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

为了完整起见,相应的 SIGNAL 和 SLOT 标记(即 Q_SLOTS、Q_SIGNALS 等)由元对象编译器(又名)处理。moc,将它们放入“.moc”文件的方式。如果您打开这些文件,您可以自己查看。有关更多详细信息,请查看可在此处找到的 moc 源代码。

于 2014-03-15T06:55:55.630 回答