我已将 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;
}
};
到目前为止一切顺利,我的插槽已执行。然而,组框的内容也会被启用/禁用。有没有办法防止这种情况发生?还是我必须手动重置原始启用/禁用状态?
最佳答案
有没有办法阻止启用/禁用内容?
是的,但是这条路并不容易,因为没有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
到复选框的状态(你应该自己存储它):
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
child 直接使用this->findChildren<QWidget*>
建议
您可以使用上述方法或删除标准复选框和(或)标签并放置您自己的 QCheckBox
在组上(当然没有布局)并根据需要使用它。如果您的组可以移动,您还需要移动复选框。
关于qt - 覆盖可检查的 QGroupBox 切换行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25559932/