有没有办法阻止启用/禁用内容?
是的,但这种方式并不容易,因为那里没有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