【问题标题】:Is it possible to change default behavior of a checkable QGroupBox?是否可以更改可检查 QGroupBox 的默认行为?
【发布时间】:2020-06-22 00:29:57
【问题描述】:

问题很简单:是否可以更改可检查 QGroupBox 对象的默认行为?我设计了一个用户界面,其中包含了许多Checiveable QGroupbox中的QlineEdit对象,所需的行为是:当QGroupbox未选中时,所有的子项都会启用,并且当检查其所有子项时都会禁用。

正如您在官方 QGroupBox 文档中看到的那样,它说:

如果选中复选框,则启用组框的子项;否则,孩子将被禁用并且用户无法访问。

【问题讨论】:

    标签: qt behavior qgroupbox


    【解决方案1】:

    一个技巧是修改绘画,以便在检查时不显示检查,反之亦然:

    #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();
    }
    

    【讨论】:

    • 是否可以对其进行子类化并覆盖实现所描述行为的函数而不是paintEvent?
    • @SávioBrilhante 我想做你所说的,但不好的是启用/禁用儿童的部分是由无法覆盖的私有 Qt API 实现的。更多信息请查看:code.qt.io/cgit/qt/qtbase.git/tree/src/widgets/widgets/…
    • 谢谢,它确实有效。但是,我是编程新手,尤其是图形界面编程新手,我想知道:这是最好的解决方案吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多