2017-02-27 26 views
0

我在Qt中有一個MainWindow類,其中放置了幾個可檢查的QGroupBox窗口小部件。更改另一個類中的窗口小部件類型的行爲

我想要做的是,引發普遍的onClick(布爾檢查)插槽每當QGroupBox對象之一(任何)被點擊,識別發送者,並引發一些代碼。

我需要捕獲對象的「單擊」信號,以防止點擊控件時對其子對象執行禁用動作。

這是我試圖處理信號:

class Q_WIDGETS_EXPORT QGroupBox : public QWidget 
{ 
    ... 
    Q_SIGNALS: 
     void clicked(bool checked = false); 
    ... 
}; 

我嘗試添加像這樣的定製插槽,並試圖與上述但由於QGroupBox在其自身的信號連接它不是一個對象或指針,操作失敗。

void MainWindow::onClick(bool clicked) 
{ 
    qDebug()<<"Custom slot triggered"; 
} 

長話短說,我需要在我的MainWindow類中處理控件類型的默認行爲。

感謝您提前提出任何建議。

+0

你是怎麼做到的「我設法覆蓋了我的MainWindow.cpp文件中的QGroupBox類'setChecked方法」? – sddk

+0

我真的不知道,但我只是在我的MainWindow類中編寫方法名稱,並且當加載MainWindow時,對於添加到MainWindow中的每個QGroupBox,該方法都會觸發一次。 –

+0

您不能通過繼承該類來覆蓋類的方法。 – sddk

回答

0

@Kuba Ober,也許你是對的,我無法分辨清楚我的問題及其周圍的事實。謝謝你指出。

在檢查出QGroupBox類的源代碼後,我發現在「clicked」事件中每隔一個操作後就會發出一個「切換」信號。

http://code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/widgets/qgroupbox.cpp

void QGroupBox::setChecked(bool b) 
{ 
    Q_D(QGroupBox); 
    if (d->checkable && b != d->checked) { 
     update(); 
     d->checked = b; 
     d->_q_setChildrenEnabled(b); 
#ifndef QT_NO_ACCESSIBILITY 
     QAccessible::State st; 
     st.checked = true; 
     QAccessibleStateChangeEvent e(this, st); 
     QAccessible::updateAccessibility(&e); 
#endif 
     emit toggled(b); 
    } 
} 

通過結合與@rbaleksandar的建議的這個信息,我設法獲得解決方案。

我迭代了我的MainWindow類的控件,並將每個QGroupBox的「切換」信號連接到一個常見的「MainWindow :: onToggle」插槽,在該插槽中我可以處理我期望的事件後操作。

至於我以前的做法,我可以創建一個類繼承QGroupBox並覆蓋任何我想要的方法。但是,與我目前的解決方案相比,這將是矯枉過正的。我想出的修復方法完美無缺。

感謝大家的見解和幫助。

2

我需要捕獲對象的「單擊」信號,以防止單擊控件時對其子對象執行的禁用動作。

也許,但我在這裏嗅到XY Problem。通過調用窗口小部件上的blockSignals(),您當然可以防止信號發射。但這是一種破解 - 它也會阻止Qt的內部人員對該對象的destroyed()信號採取行動,並且您可能巧妙地破壞對象信號的其他用戶。

取而代之,可以使UI有狀態並讓控制器實現按鈕與應用程序其餘部分交互的狀態方面。目前,該按鈕的clicked()信號直接連接到其他用戶。相反,將按鈕連接到控制器,並讓控制器僅在適當時禁用這些孩子。人們可以使用QStateMachine來使狀態行爲清晰。

相關問題