2009-04-21 29 views
1

我有兩個互相傳遞信息的進程。 過程A是向過程B發送消息的正常(即非qt)程序。過程B是一個QT GUI應用程序,將接收到的消息顯示在文本框中。區分設計器和運行時代碼

我創建了一個自定義的窗口小部件(稱爲ShowMessages),它繼承自QPlainTextEdit,並在計時器到期時從管道讀取消息,並將它們附加到文本框中。代碼並不是真的這樣設計的(我認爲這會是非常糟糕的設計),但這只是爲了使事情變得簡單。 由於我不會說的原因,當我使用qt-designer創建表單時,無法關閉進程A.

問題是,當我使用qt設計器(因此選擇ShowMessages小部件並將其放入窗口內)時,即使我在設計器中,小部件也會顯示消息。此功能很酷,但問題在於,當我保存表單時,已存在的消息保存在.ui文件中,當我啓動進程B時會導致不良行爲(因爲進程開始顯示在創建階段收到的消息) 。

我可以在進程B啓動後立即清理文本框,但我認爲避免消息存在於.ui文件中會好得多。我想要的是能夠編寫這樣的小部件代碼:

if <I'm not in the designer> 
    timer = QtCore.QTimer(self) 
    QtCore.QObject.connect(timer, QtCore.SIGNAL("timeout()"), self, QtCore.SLOT("on_timer()")); 
    timer.start(2000) 

是否有一個qt函數來知道我是否在設計器中?你認爲區分設計者和運行時代碼是「壞」嗎?

(對不起,我的錯誤,但英語不是我的主要語言)

回答

1

也許你的部件應該有一個標誌是否是「積極的」,它默認爲false,所以當你在設計的時候,它不什麼都不做。在代碼中,當您想要查看消息時,您可以將其設置爲活動狀態。那麼你也有能力在其他情況下關閉它。

但是我必須說,這聽起來像是將「控制器」代碼放入一個「視圖」小部件中,它可能並且可能會爲您帶來麻煩(包括當前的Qt設計器問題現在)。

考慮閱讀MVC(模型 - 視圖 - 控制器)設計模式,如果還沒有的話。

更新:

說句公道話,你的問題沒有問如何檢測無論你在設計師:)

http://doc.trolltech.com/4.3/designer-creating-custom-widgets.html#creating-well-behaved-widgets

爲了讓自定義部件在特殊 行爲Qt Designer,提供 實現的初始化() 函數來配置構件 構造p針對Qt Designer 的具體行爲。這個函數將在 之前第一次被調用,所有對createWidget()的調用可能會設置一個內部標誌,當Qt設計器調用 插件的createWidget()函數時, 可能會被稍後測試。

根據該文檔,您基本上可以在您的小部件的initialize()函數中將「inDesignerFlag」設置爲true。然後在你的Widget代碼中根據需要檢測該標誌。