【问题标题】:Qt SLOT macro used as function argumentQt SLOT 宏用作函数参数
【发布时间】:2014-04-20 14:15:12
【问题描述】:

我正在浏览 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 的内容。

【问题讨论】:

  • 0个月后这个问题还没有解决吗??

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


【解决方案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 源代码。

【讨论】:

  • “SIGNAL 和 SLOT 标记由元对象编译器处理” - 不,它们只是在运行时进行一些字符串处理,以便 connect() 可以查找信号和槽。它们还通过连接调用的位置,因此 connect() 可以打印可读错误。moc(在构建时)根本不处理它们。
  • @FrankOsterfeld:我更新了以更清楚地表达我想要表达的内容。
  • @LaszloPapp:哇,看到我是 Qt 的初学者,这似乎有点让我头疼,但随着时间的推移我会明白的。感谢您的回答。
  • @LaszloPapp:好吧,我将根据相同的计算器示例将其作为一个单独的问题发布。在创建诸如乘法按钮之类的按钮小部件时,我看到传递给 setText() 的字符串为 tr("\303\227")。 “\303\227”是一种字符编码吗?究竟是什么?提前致谢。
  • @DanielJG:你能改述一下吗?目前,我不明白。您的问题中没有 setText 等。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
相关资源
最近更新 更多