簡體   English   中英

QT - 如何將小部件放在互斥組中?

[英]QT - How to place widgets in mutually exclusive groups?

我正在做類似以下的事情:

例子

但是使用單選按鈕而不是復選框。 在上面的圖片中,小部件被放入可以啟用/禁用的組中,但我希望一次只啟用 1 個組(在示例中,組 A 和組 C 均啟用)。

我使用QGroupBox做了上面的例子,但它只提供普通的復選框,據我所知,不提供單選按鈕。

出現在QGroupBox中的QGroupBox不是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();
}

您可以將每個 QGroupBox 的切換信號與另一個的 setDisabled 插槽聯系起來。

ps:我知道為時已晚,但如果其他人需要它,我只是將其放在這里。 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM