有没有办法防止启用/禁用内容?
是的,但这种方式并不容易,因为那里没有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
按下或鼠标单击复选框。存储复选框值并执行您需要的操作。使用此代码检查光标下的内容:
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
为checkBox的状态(你应该自己存储):
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.方法initStyleOption
inQGroupBox
不是虚拟的,这就是为什么您还需要重新实现paintEvent
:
void paintEvent(QPaintEvent *)
{
QStylePainter paint(this);
QStyleOptionGroupBox option;
initStyleOption(&option);
paint.drawComplexControl(QStyle::CC_GroupBox, option);
}
我是否必须手动重置原始启用/禁用状态?
您不能这样做,setEnabled
因为它会检查当前的检查状态并阻止启用子级。虽然您可以setEnabled
直接使用this->findChildren<QWidget*>
建议
您可以使用上述方法或删除标准复选框和(或)标签并将自己的QCheckBox
放在组上(当然没有布局)并根据需要使用它。如果您的组可以移动,您还需要移动该复选框。