c++ - QT - 如何将小部件放置在互斥组中?

标签 c++ qt qt5 qgroupbox

我想做类似下面的事情:

例子

但是使用单选按钮而不是复选框。在上面的图片中,小部件被放置在可以启用/禁用的组中,但我只想一次启用 1 个组(在示例中,组 A 和组 C 都启用)。

我用 QGroupBox 做了上面的例子,但据我所知,它只提供普通复选框,不提供单选按钮。

最佳答案

出现在QGroupBox中的ckeckbox不是QCheckBox,它只是一个绘图。因此,一个可能的解决方案是创建一个管理 QGroupBox 检查的类。

#include <QApplication>
#include <QGroupBox>
#include <QLineEdit>
#include <QRadioButton>
#include <QSlider>
#include <QVBoxLayout>

class ExclusiveManager: public QObject{
public:
    using QObject::QObject;
    void addGroupBox(QGroupBox *groupbox){
        if(groupbox){
            groupbox->blockSignals(true);
            groupbox->setChecked(m_groupboxs.isEmpty());
            groupbox->blockSignals(false);
            m_groupboxs << groupbox;
            connect(groupbox, &QGroupBox::toggled, this, &ExclusiveManager::onToggled);
        }
    }
private slots:
    void onToggled(bool on){
        QGroupBox *groupbox = qobject_cast<QGroupBox *>(sender());
        if(on){
            for(QGroupBox *g: m_groupboxs){
                if(g != groupbox && g->isChecked()){
                    g->blockSignals(true);
                    g->setChecked(false);
                    g->blockSignals(false);
                }
            }
        }
        else{
            groupbox->blockSignals(true);
            groupbox->setChecked(false);
            groupbox->blockSignals(false);
        }
    }
private:
    QList<QGroupBox *> m_groupboxs;
};

class Widget: public QWidget{
public:
    Widget(QWidget *parent=nullptr):QWidget(parent){
        setLayout(new QVBoxLayout);

        ExclusiveManager *manager = new ExclusiveManager(this);

        group_a = new QGroupBox("Group A");
        group_a->setCheckable(true);
        group_b = new QGroupBox("Group B");
        group_b->setCheckable(true);
        group_c = new QGroupBox("Group C");
        group_c->setCheckable(true);
        layout()->addWidget(group_a);
        layout()->addWidget(group_b);
        layout()->addWidget(group_c);

        manager->addGroupBox(group_a);
        manager->addGroupBox(group_b);
        manager->addGroupBox(group_c);

        QVBoxLayout *layA = new QVBoxLayout();
        layA->addWidget(new QLineEdit);
        group_a->setLayout(layA);

        QVBoxLayout *layB = new QVBoxLayout();
        layB->addWidget(new QRadioButton("Option 1"));
        layB->addWidget(new QRadioButton("Option 2"));
        group_b->setLayout(layB);

        QVBoxLayout *layC = new QVBoxLayout();
        layC->addWidget(new QSlider(Qt::Horizontal));
        group_c->setLayout(layC);
    }
private:
    QGroupBox *group_a;
    QGroupBox *group_b;
    QGroupBox *group_c;
};

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

关于c++ - QT - 如何将小部件放置在互斥组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51285804/

相关文章:

linux - 项目错误 : Unknown module(s) in QT: webkitwidgets

c++ - 单击不同窗口上的按钮时更改类的参数

c++ - 如何将 vector 插入到特定位置的另一个 vector 中,这样我将同时获得这两个 vector 的大 vector ,并且该位置将被覆盖?

c++ - 为什么使用 cv::line 函数绘制的不同线条具有不同的透明度 (alpha) 级别?

c++ - 编译运行libconfig++

c++ - QCanBusDevice 缓冲区刷新

qt - LLDB 数据格式化程序可以调用方法吗?

Qt 应用程序中的 c++ boost::thread() - 错误:函数参数太多

c++ - 如何将现有的Q_PROPERTY重新定义为REQUIRED?

c++ - std::move 一个 vector 到另一个 vector ,地址不更新