2014-08-29 60 views
2

我已經將QGroupBox類中的子類化,並啓用了checkable屬性。我試圖覆蓋切換/檢查事件的行爲。覆蓋可檢查QGroupBox切換行爲

下面的代碼:

class SideWidgetGroupBox: public QGroupBox 
{ 
    Q_OBJECT 
public: 
    SideWidgetGroupBox(QWidget* parent = 0): QGroupBox(parent) 
    { 
     this->setCheckable(true); 
     connect(this, SIGNAL(toggled(bool)), this, SLOT(my_toggled(bool))); 
    } 

private slots: 
    void my_toggled (bool on) 
    { 
     std::cout << "my toggled method" <<std::endl; 
    } 
}; 

到目前爲止好,我插槽得到執行。然而,groupboxs的內容也被啓用/禁用。有沒有辦法阻止?還是必須手動重置原來的啓用/禁用狀態?

回答

5

有沒有辦法阻止啓用/禁用內容?

是的,但這種方式並不容易,因爲那裏沒有QCheckBox。看起來像一個複選框的區域是QGroupBox。並且所有事件都由QGroupBox處理:
1.重寫event方法並阻止處理基類中的QEvent::KeyReleaseQEvent::MouseRelease事件。

bool SideWidgetGroupBox::event(QEvent *e) 
{ 
    switch (e->type()) { 
    case QEvent::KeyRelease: 
    case QEvent::MouseButtonRelease: 
    myHandler(e); 
    return true; 
    } 
return QGroupBox::event(e); 
} 

2.在myHandler檢查是否按下space或者鼠標點擊了複選框。存儲checkBox值並做你需要的。使用此代碼檢查什麼是下光標:

QStyleOptionGroupBox box; 
initStyleOption(&box); 
QStyle::SubControl released = style()->hitTestComplexControl(QStyle::CC_GroupBox, &box, 
                  event->pos(), this); 
bool toggle = released == QStyle::SC_GroupBoxLabel || released == QStyle::SC_GroupBoxCheckBox; 
if (toggle) 
{ 
    m_state = !m_state; 
    update(); 
} 

3.添加方法initStyleOption並設置state的複選框的狀態(你應該自己將它存儲):

void SideWidgetGroupBox::initStyleOption(QStyleOptionGroupBox *option) const 
{ 
    QGroupBox::initStyleOption(option); 
    QStyle::State flagToSet = m_state ? QStyle::State_On : QStyle::State_Off; 
    QStyle::State flagToRemove = m_state ? QStyle::State_Off : QStyle::State_On; 

    option->state |= flagToSet;  
    option->state &= ~flagToRemove; 
    option->state &= ~QStyle::State_Sunken; 
} 

4.Method initStyleOptionQGroupBox不是虛擬的,這就是爲什麼你需要重新實現paintEvent也:

void paintEvent(QPaintEvent *) 
{ 
    QStylePainter paint(this); 
    QStyleOptionGroupBox option; 
    initStyleOption(&option); 
    paint.drawComplexControl(QStyle::CC_GroupBox, option); 
} 

我必須手動重置原來的啓用/禁用狀態嗎?
您不能使用setEnabled來做到這一點,因爲它會檢查當前的選中狀態並阻止啓用子項。雖然你可以調用setEnabled兒童直接使用this->findChildren<QWidget*>

建議
您可以使用上述方法或刪除標準的複選框和(或)標籤,並把自己的QCheckBox在組(沒有佈局,當然)和根據需要使用它。如果你可以移動組,你也需要移動複選框。

+0

哇,我想這會更容易。我正在嘗試使用您的解決方案,但我無法設置checkBox的狀態。我猜這條線應該這樣做:'選項 - >狀態| =(狀態?QStyle :: State_On:QStyle :: State_Off);',我試着用真/假值,但它似乎沒有做任何事情。 – 2014-08-29 10:56:58

+1

@istee在答案中更新了2,3。並添加了4.還有一個困難:initStyleOption不是虛擬的。 – Ezee 2014-08-29 12:27:41

+0

感謝您的更新。它現在正在工作 – 2014-08-29 14:21:29