为什么要将一个槽声明为槽?

4

在Qt中,基本上任何东西都可以用作信号的插槽(只要签名兼容),那么为什么我要将成员函数声明为插槽呢?将成员函数声明为插槽真的只是从C++11之前的时代遗留下来的吗?


1
声明为槽的函数也可以直接从QML中调用,但这是多余的,因为我们也可以使用Q_INVOKABLE。 - JarMan
1
如果希望在Qt设计器中连接它,我认为它必须被声明为槽(slot)。基本上,在需要有关函数的元数据的任何情况下,它都必须是一个槽。 - Marek R
2个回答

4

虽然这已经成为一种罕见的情况,但仍然有一些用途可以将方法声明为槽,如果您想在连接(即基于字符串的连接)中使用SIGNAL()/SLOT()宏。例如:

  • 如果您使用工厂创建多个不相关类的实例,则可以创建基于字符串的连接,而无需对涉及的对象进行内省。
    一个很好的例子是QLineEditQTextEdit;它们没有相互继承,但都有一个textChanged信号,您可以创建一个窗口,在其中动态添加前者或后者的实例。
  • 如果您想要建立一个信号到槽的连接,其中槽具有比信号更多的参数(带有默认值)。
    这在这里有解释。
  • 用于将C++对象连接到QML对象(来自同一页),因为QML对象的信号/槽只是.qml文件中的文本。

基于字符串的连接的缺点(或我猜函数对象连接的优点)在同一页中列出。


0

将某些东西标记为插槽,基本上只是旧版Qt和C++11之前的遗留问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接