我已经将QGroupBox类子类化,并启用了checkable属性。我试图覆盖切换/检查事件的行为。
以下是代码:
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&#39;内容也被启用/禁用。有办法防止这种情况吗?或者我是否必须手动重置原始启用/禁用状态?
答案 0 :(得分:6)
有没有办法阻止启用/停用内容?
是的,但这种方式并不容易,因为那里没有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
设置为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
中的QGroupBox
方法不是虚拟的,这也是您需要重新实现paintEvent
的原因:
void paintEvent(QPaintEvent *)
{
QStylePainter paint(this);
QStyleOptionGroupBox option;
initStyleOption(&option);
paint.drawComplexControl(QStyle::CC_GroupBox, option);
}
我是否必须手动重置原始启用/禁用状态?
您无法使用setEnabled
执行此操作,因为它会检查当前检查状态并阻止启用子项。虽然您可以直接使用setEnabled
this->findChildren<QWidget*>
<强>建议强>
您可以使用上述方法或删除标准的checkBox和(或)标签,并将您自己的QCheckBox
放在组上(当然没有布局),并根据需要使用它。如果您可以移动组,则还需要移动复选框。