【问题标题】:Does it worth keeping using the 'slots' mark in Qt 5? [duplicate]在 Qt 5 中继续使用“插槽”标记是否值得? [复制]
【发布时间】:2021-06-16 02:18:17
【问题描述】:

我非常了解使用new syntax for connecting slots in Qt 5 的好处和坏处。仅提及一些:

优点:

  • 编译时间检查(槽存在,兼容的参数...)
  • 可以使用 lambda(适用于非常短且特定的时隙)
  • 保护私有/受保护的插槽不被类外调用 (ref)

对比:

  • 在某些情况下语法更复杂(特别是重载)
  • 不支持带默认值参数的槽

我也知道在某些(极少数)情况下(目前)还不能使用新语法 (QFileDialog::open)。

现在,对于旧语法,我们必须在定义中将这些方法标记为 slots,用 Q_OBJECT 宏标记类,moc 它,并从 @ 继承987654327@。如上所述,新语法不需要我标记为 slots 的方法。

在使用(并且仅使用)新语法时保留slots 说明符有什么好处?如果插槽是一个类使用的唯一QMetaObject 的特征,那么我们可以避免将类标记为Q_OBJECT,甚至从QObject 本身继承。

【问题讨论】:

  • 如果您使用 QML,定义为 slot 的函数也可以从 QML 调用。但这也可以通过使用Q_INVOKABLE来实现。
  • @JarMan 好点,我还没有大量使用 QML,所以对我来说这是一个未开发的世界。谢谢!

标签: c++ qt qt5 signals-slots


【解决方案1】:

如果槽是一个类使用的唯一 QMetaObject 的特征,我们就可以避免将类标记为 Q_OBJECT 的必要性,甚至可以避免从 QObject 本身继承。

您仍然需要从QObject 本身继承,因为您需要一个对象来调用该函数。该对象必须从 QObject 继承,以便 Qt 可以检测它在哪个线程上(插槽调用可能需要在不同的线程上排队)并在接收器被销毁时处理自动断开连接。

但是,您可以通过将信号 QObject 作为接收对象并使用 lambda 来解决此问题,而不会有太多麻烦:

connect(qObjectInstance, &QObjectClass::signal, qObjectInstance, [&](){
    notAQObject->slot();
});

但如果notAQObject 可能在QObject 发出信号之前被破坏,您将不得不自己管理断开连接。

slots 宏而言:如果您使用严格的C++ 并且没有通过QMetaObject 查找插槽,slots 不会为您做任何事情。 slots 或类似的东西 (Q_INVOKABLE) 如果您与更多使用 Qt MetaObject 系统的东西(例如 QML)进行互操作,通常是必要的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-01
    • 2017-06-30
    • 1970-01-01
    • 2017-03-08
    • 1970-01-01
    • 2013-07-25
    • 2013-05-23
    相关资源
    最近更新 更多