【问题标题】:Qt 5.9 slot naming bugQt 5.9 插槽命名错误
【发布时间】:2017-10-09 10:14:08
【问题描述】:

我使用的是 Qt 5.9。

我在声明具有下划线样式的插槽时遇到问题,特别是当我使用超过 2 个下划线命名时。例如使用 void on_stop_treatment() 插槽,即使我没有建立连接,我也会得到 QMetaObject::connectSlotsByName: No matching signal for on_stop_treatment()

无论如何,建立连接,即使我收到相同的消息,插槽信号机制也可以工作。删除第二个下划线我没有收到错误消息并且该机制有效。 (我也试过删除moc文件并重建)

【问题讨论】:

  • 这不是错误,moc 连接由 Qt Designer 创建的一些插槽使用方法connectSlotsByName,此方法将尝试连接任何格式为on_<object>_<signal> 的插槽,在您的情况下您的插槽具有该格式,因此它正在您的班级中寻找
  • 但是从你的回答中我明白我应该得到 QMetaObject::connectSlotsByName: No matching signal for stop() 而不是 QMetaObject::connectSlotsByName: No matching signal for on_stop_treatment()
  • 不,它会尝试在假设的stop 对象上寻找假设的treatment 信号

标签: c++ qt qt-slot


【解决方案1】:

使用名称 on_stop_treatment 声明您的插槽将与名为 Signal/Slot Automatic Connections 的 Qt 功能发生冲突

Qt 将为您的插槽检测此特定语法,并尝试将 stop 与名为 stop 的 QObject 和 treatment 与在 QObject 类中声明的该名称的信号进行匹配。

为了实现这一点,Qt 在内部使用QMetaObject::connectSlotsByName(this); 来执行自动信号/插槽连接。

【讨论】:

  • 这个问题重复了,不用回答了。
  • 不,OP 问他为什么在这样命名他的插槽时会出现此错误。 jhy 的其他问题询问为什么他的信号/插槽自动连接不能像他想要的那样工作。这里没有重复
  • 完全 OT,但我喜欢你的头像。送牛奶的丹在他的工作中(或凯伦)真的没有得到足够的赞赏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
相关资源
最近更新 更多