2014-08-29 69 views
2

我已经将QGroupBox类中的子类化,并启用了checkable属性。我试图覆盖切换/检查事件的行为。覆盖可检查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; 
    } 
}; 

到目前为止好,我插槽得到执行。然而,groupboxs的内容也被启用/禁用。有没有办法阻止?还是必须手动重置原来的启用/禁用状态?

回答

5

有没有办法阻止启用/禁用内容?

是的,但这种方式并不容易,因为那里没有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或者鼠标点击了复选框。存储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 initStyleOptionQGroupBox不是虚拟的,这就是为什么你需要重新实现paintEvent也:

void paintEvent(QPaintEvent *) 
{ 
    QStylePainter paint(this); 
    QStyleOptionGroupBox option; 
    initStyleOption(&option); 
    paint.drawComplexControl(QStyle::CC_GroupBox, option); 
} 

我必须手动重置原来的启用/禁用状态吗?
您不能使用setEnabled来做到这一点,因为它会检查当前的选中状态并阻止启用子项。虽然你可以调用setEnabled儿童直接使用this->findChildren<QWidget*>

建议
您可以使用上述方法或删除标准的复选框和(或)标签,并把自己的QCheckBox在组(没有布局,当然)和根据需要使用它。如果你可以移动组,你也需要移动复选框。

+0

哇,我想这会更容易。我正在尝试使用您的解决方案,但我无法设置checkBox的状态。我猜这条线应该这样做:'选项 - >状态| =(状态?QStyle :: State_On:QStyle :: State_Off);',我试着用真/假值,但它似乎没有做任何事情。 – 2014-08-29 10:56:58

+1

@istee在答案中更新了2,3。并添加了4.还有一个困难:initStyleOption不是虚拟的。 – Ezee 2014-08-29 12:27:41

+0

感谢您的更新。它现在正在工作 – 2014-08-29 14:21:29