【问题标题】:Total number of signals/slots connections?信号/插槽连接总数?
【发布时间】:2015-10-06 18:48:04
【问题描述】:

有没有办法在 Qt 应用程序中找到信号/插槽连接的总数有人向我推荐伽马射线,但有没有更简单的解决方案?

【问题讨论】:

  • 您在谈论信号/插槽连接,对吗?我调整了问题,因为“连接”也可以是数据库或网络。您是否也想计算 Qt 内部连接,还是只计算来自您自己对象的连接?你需要这些信息做什么?可能有更好的解决方案。这有帮助吗? stackoverflow.com/questions/2755694/…
  • 感谢您的 cmets 和编辑,我实际上正在寻找一种方法来检查和检查是否存在重复连接,例如有时同一信号/插槽对被多次连接。
  • @Nyaruko 不是您问题的答案,但如果您想避免重复,您可以使用 Qt::UniqueConnection 标志。顺便说一句,GammaRay 是开源的,你可以研究它的代码。这是一个非常强大的工具。
  • 其他方式 - 是手动跟踪每个连接。 QObject::connection 返回 QMetaObject::Connection 对象。您可以编写一个包装类,它将存储此信息并将附加到您的对象。

标签: c++ qt


【解决方案1】:

检查Qt::UniqueConnection。

这是一个可以与上述任何一种连接类型组合的标志,使用按位或。当设置了 Qt::UniqueConnection 时,如果连接已经存在(即,如果相同的信号已经连接到同一对对象的相同插槽),则 QObject::connect() 将失败。 [...]

然后在连接已经存在的情况下使用断言,这将使您的程序崩溃,指示编程错误:

QLabel *label = new QLabel;
QLineEdit *lineEdit = new QLineEdit;
auto ok = QObject::connect(lineEdit, &QLineEdit::textChanged,
             label,  &QLabel::setText,
             Qt::UniqueConnection);
Q_ASSERT(ok);

免责声明:未经测试。

【讨论】:

  • bool ok = QObject::connect 是错误的。返回类型为QMetaObject::Connection - 它可能用于未来的诊断。
  • 无论如何,您的解决方案不是答案,因为您无法计算现有连接的数量。
  • 这难道不是以最优雅的方式解决根本问题并帮助那些无法表达自己的问题而不会被两次否决的人吗?随时提供更好的解决方案,我很乐意审查并推动它。
  • 所以我们应该向@Nyaruko 询问潜在问题,而不是使用心灵感应。顺便说一句,我没有投反对票。
  • @Dmitry,bool ok = QOjbect::connect 使用 QMetaObject::Connection 的 bool cast 运算符来确定连接是否有效。
猜你喜欢
  • 2012-10-15
  • 1970-01-01
  • 2015-03-14
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2016-10-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多