是否可以更改可检查 QGroupBox 的默认行为?
Is it possible to change default behavior of a checkable QGroupBox?
问题很简单:是否可以更改可检查 QGroupBox 对象的默认行为?我在一个可检查的 QGroupBox 中设计了一个带有许多 QLineEdit 对象的用户界面,期望的行为是:当 QGroupBox 未被选中时,它的所有子项都启用,而当它被选中时,它的所有子项都被禁用。
正如您在 QGroupBox 官方文档中看到的那样,它说:
If the check box is checked, the group box's children are enabled; otherwise, the children are disabled and are inaccessible to the user.
一个技巧是修改绘画,以便在检查时不显示检查,反之亦然:
#include <QtWidgets>
class GroupBox: public QGroupBox{
public:
using QGroupBox::QGroupBox;
protected:
void paintEvent(QPaintEvent *){
QStylePainter paint(this);
QStyleOptionGroupBox option;
initStyleOption(&option);
if(isCheckable()){
option.state &= ~(isChecked() ? QStyle::State_On : QStyle::State_Off);
option.state |= (isChecked() ? QStyle::State_Off : QStyle::State_On);
}
paint.drawComplexControl(QStyle::CC_GroupBox, option);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GroupBox groupBox;
groupBox.setCheckable(true);
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(new QLineEdit);
vbox->addWidget(new QLineEdit);
vbox->addWidget(new QLineEdit);
vbox->addStretch(1);
groupBox.setLayout(vbox);
groupBox.show();
return a.exec();
}
问题很简单:是否可以更改可检查 QGroupBox 对象的默认行为?我在一个可检查的 QGroupBox 中设计了一个带有许多 QLineEdit 对象的用户界面,期望的行为是:当 QGroupBox 未被选中时,它的所有子项都启用,而当它被选中时,它的所有子项都被禁用。
正如您在 QGroupBox 官方文档中看到的那样,它说:
If the check box is checked, the group box's children are enabled; otherwise, the children are disabled and are inaccessible to the user.
一个技巧是修改绘画,以便在检查时不显示检查,反之亦然:
#include <QtWidgets>
class GroupBox: public QGroupBox{
public:
using QGroupBox::QGroupBox;
protected:
void paintEvent(QPaintEvent *){
QStylePainter paint(this);
QStyleOptionGroupBox option;
initStyleOption(&option);
if(isCheckable()){
option.state &= ~(isChecked() ? QStyle::State_On : QStyle::State_Off);
option.state |= (isChecked() ? QStyle::State_Off : QStyle::State_On);
}
paint.drawComplexControl(QStyle::CC_GroupBox, option);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
GroupBox groupBox;
groupBox.setCheckable(true);
QVBoxLayout *vbox = new QVBoxLayout;
vbox->addWidget(new QLineEdit);
vbox->addWidget(new QLineEdit);
vbox->addWidget(new QLineEdit);
vbox->addStretch(1);
groupBox.setLayout(vbox);
groupBox.show();
return a.exec();
}