2013-05-28 26 views
2

我有一個包含其他類的類/ QDialog(我們稱之爲「Frame」)。這是什麼樣子:從QWidget中的另一個類訪問方法

Frame Class

在上面的截圖中,綠色矩形內的一切實際上是一個單獨的類/自定義QWidget的(姑且稱之爲「第三頁」,因爲它是在列表中的第三項)放置在QStackedWidget中,而矩形外的所有內容都是Frame的一部分。因此矩形內的所有東西都與框架分開,即使它看起來是同一個表格的一部分。點擊概述SQLite日記本對象導致在QStackedWidget中加載單獨的頁面。所有這些類都必須能夠相互通信。

問題是,我不知道如何從Page3內部訪問Frame的公共方法或變量。請參閱第3頁的其中一個功能,是在兩個密碼字段的內容(密碼 & 重複)匹配時解鎖幀中的確定按鈕。爲此,Page3需要調用解鎖Frame中按鈕的方法。我需要與當前正在運行的Frame實例進行通信,而不是創建新副本,因此從Page3內部實例化Frame不起作用。我不能使用parent(),因爲它只是引用Frame內的QStackedWidget而不是Frame本身。

我會很感激,如果有人能告訴我如何做到這一點。

回答

2

我更喜歡使用信號和插槽來做這種事情(子部件和它的父部件之間的通信)。爲什麼?因爲如果孩子明確地依賴父母,最終會產生循環依賴,並且將來很難改變你的設計。

最簡單的解決方案是讓Page3發出一個「unlockOk」信號,該信號連接到Frame中的一個插槽,該插槽可以實現按鈕的實際「解鎖」。 Frame可以在其構造函數中連接信號和插槽,或者在其他地方實際實例化Page3對象。

如果你想更進一步,你可以使信號更通用;例如,稱爲「inputValid」(當密碼字段匹配時將被髮射)和「inputInvalid」的信號,其將被連接到「unlockOk」和「lockOk」插槽。這樣做的原因是,如果需要,您可以在應用程序的其他部分重新使用信號,並且他們的名字清楚地表明他們正在通信的內容。

+0

這聽起來像它可能工作。有沒有一種特殊的方式來發送類之間的信號?我問,因爲我從來沒有這樣做過。 –

+0

查看Qt文檔:http://qt-project.org/doc/qt-4.8/signalsandslots.html在類聲明的「signals」部分聲明一個信號,並在「slots 「 部分;然後像普通的類方法那樣定義插槽方法。然後使用'QObject :: connect'方法將它們連接到某個地方,如下所示:'connect(page3,SIGNAL(inputValid()),this,SLOT(unlockOk()));' –

+0

您的解決方案效果很好。謝謝! –

相關問題