qt - 覆盖可检查的 QGroupBox 切换行为

标签 qt checkbox overriding toggle qgroupbox

我已将 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::KeyReleaseQEvent::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.方法initStyleOptionQGroupBox不是虚拟的,这就是为什么你需要重新实现 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/

相关文章:

Javascript 复选框 onChange

jquery - 这可能是带有自动完成和复选框的下拉列表吗?

java - 如何获取具有文本和复选框字段的整个表的值 jsp 到 servlet

swift - 在swift中子类化专门的泛型类

python - 获取子类的重写函数

web-services - 如何使用 QNetworkAccessManager 将数据发布到 url

c++ - 应用程序的自定义任务栏菜单

hotmail.com上的QT SSL错误: The issuer certificate of a locally looked up certificate could not be found

c++ - 错误:命名空间 'enable_if_t'中没有名为 'std'的模板;你是说 'enable_if'吗?

python - 覆盖包方法,当该方法在包内部导入时