2012-08-13 61 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程序都會有控制檯輸出。這也導致更容易維護的代碼,因爲它會捕獲稍後的信號或插槽的更改,並強制進行更改的程序員更新連接。