2012-08-13 62 views
3

调试信号和插槽可能很难,因为调试器在发射信号时不会跳转到信号的插槽。调试Qt信号和插槽有哪些最佳实践?调试Qt信号和插槽有哪些最佳做法?

特别

  1. 如何确保连接建立成功?
  2. 什么时候应该使用信号和插槽,何时应该避免它们?
  3. 根据您的经验,最有效的调试技术是什么?

回答

4

有写而回叫20 ways to debug Qt signals and slots
它解决了我觉得#1,您的问题#3一篇博客文章。

对于#2,我并不认为使用或不使用信号/插槽真的有一个硬性和快速的原因,因为它们是GUI框架的一个相当核心的概念。信号是将一个组件的知识与另一个组件分离的完美方式,允许您设计可重用的小组件,只需声明状态更改或通知即可。通过发出主线程可以看到的信号,它也是一种非常好的方式来与非GUI线程循环交流GUI更改。

有些时候你真正想要的而不是一个信号/插槽是使用事件,比如当一个父窗口小部件应该成为一些子窗口小部件的事件过滤器时。孩子们仍然不需要知道父母,父母得到更直接的事件而不是信号连接。

关于事件的同一主题,有些时候你真正想要的是从孩子 - >父母 - >祖父母 - >等事件冒泡。信号在这里意义不大,因为它们并不意味着一种确定提议的事件是否应该导致行动的方式(显然它们可以以这种方式使用)。事件允许你检查当前状态,决定这个小部件是否应该做任何事情,或者让他们把它们放在链上供别人检查。

关于The Difference Between Signals/Slots and Events有一个非常了不起的答案。这里是一个很好片段:

  • 您“拉手”事件
  • 你“得到通知的”信号发射

我喜欢那个报价是,它描述了不同需要案件。如果您需要处理小部件中的操作,那么您可能需要一个事件。如果你想知道发生的事情,那么你可能需要一个信号。

+3

根据实际的调试技术,您提供的链接相当不便。要点基本上是:*“避免写错误,这里有20件事情可能会出错”*。没有提到实际调试问题的工具或技术。当你遇到崩溃转储时,你会遇到一个疯狂的深层调用堆栈,大量的'qt_static_metacall'调用,没有简单的方法来解码发出的信号,并且根本无法知道,在哪里建立了特定的信号插槽连接。 – IInspectable 2015-09-23 07:47:39

1

如何确保连接成功建立?

对于每个失败的连接,您将在控制台输出中看到警告。

什么时候应该使用信号和插槽,什么时候应该避免它们?

在我看来,只要您希望在课堂设计中保持关注点的分离,就可以随时使用它们。你的班级可以发出一个信号,该信号可能会或可能不会被班级完全不知道的另一个班级(或多个班级)回答。这可以保持你的耦合。

根据您的经验,最有效的调试技术是什么?

我不能真正添加​​比这篇博文所说的更多的东西。 20 ways to debug Qt signals and slots

0

关于#1,我只是添加另一条信息,我没有看到上面提到或在引用的博客文章。

从文档上QObject::connect()

创建给定类型的从信号在发送对象的方法的接收器对象的连接。如果连接成功,则返回true;否则返回false。

我更喜欢断言我的连接的返回值,以确保连接成功,尤其是因为并不是所有的Qt程序都会有控制台输出。这也导致更容易维护的代码,因为它会捕获稍后的信号或插槽的更改,并强制进行更改的程序员更新连接。