有沒有辦法阻止啓用/禁用內容?
是的,但這種方式並不容易,因爲那裏沒有QCheckBox
。看起來像一個複選框的區域是QGroupBox
。並且所有事件都由QGroupBox
處理:
1.重寫event
方法並阻止處理基類中的QEvent::KeyRelease
和QEvent::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 initStyleOption
在QGroupBox
不是虛擬的,這就是爲什麼你需要重新實現paintEvent
也:
void paintEvent(QPaintEvent *)
{
QStylePainter paint(this);
QStyleOptionGroupBox option;
initStyleOption(&option);
paint.drawComplexControl(QStyle::CC_GroupBox, option);
}
我必須手動重置原來的啓用/禁用狀態嗎?
您不能使用setEnabled
來做到這一點,因爲它會檢查當前的選中狀態並阻止啓用子項。雖然你可以調用setEnabled
兒童直接使用this->findChildren<QWidget*>
建議
您可以使用上述方法或刪除標準的複選框和(或)標籤,並把自己的QCheckBox
在組(沒有佈局,當然)和根據需要使用它。如果你可以移動組,你也需要移動複選框。
哇,我想這會更容易。我正在嘗試使用您的解決方案,但我無法設置checkBox的狀態。我猜這條線應該這樣做:'選項 - >狀態| =(狀態?QStyle :: State_On:QStyle :: State_Off);',我試着用真/假值,但它似乎沒有做任何事情。 – 2014-08-29 10:56:58
@istee在答案中更新了2,3。並添加了4.還有一個困難:initStyleOption不是虛擬的。 – Ezee 2014-08-29 12:27:41
感謝您的更新。它現在正在工作 – 2014-08-29 14:21:29