Qt检查多个按钮的状态

时间:2013-10-13 19:27:57

标签: c++ qt

我正在使用StackedLayout和Buttons在屏幕之间切换。如果选中或不选中按钮,我有一个单独的样式。我也使用keyPressEvent在堆栈之间切换,而不是单击要切换的按钮。

当我使用keyPress事件时,我可以在堆栈之间切换,但按钮不会从未选中更改为已检查。

我有4个按钮,我为每个按钮编写方法,看是否按钮被选中,如下:

bool MainWindow::dashBoardButton_isChecked() {
    if(ui->dashBoardButton->isChecked()) {
        return true;
    } else {
        return false;
    };

    return false;
};

当我在堆栈之间切换时,我使用这个方法:

void MainWindow::on_dashBoardButton_clicked() {
    ui->mainStack->setCurrentIndex(0);

    if(!dashBoardButton_isChecked()) {
        ui->dashBoardButton->setChecked(true);
    };

};

我为每个按钮/堆叠做了4次。这在我看来有点重复。有没有什么方法可以缩短代码,也许有4个非常相似的方法,而不是有一种方法呢?

2 个答案:

答案 0 :(得分:0)

你可以使用QButtonsGroup或者在一组按钮上编写你自己的包装器,所以你用它们初始化这个包装器,提供按钮和一些值之间的映射,描述哪些被检查,你可以将每个按钮连接到槽这个包装器可以更新值,你可以使用信号槽机制从包装器发出这种变化的信号。您可以使用QSignalMapper

Keypad::Keypad(QWidget *parent)
        : QWidget(parent)
    {
        QSignalMapper *signalMapper = new QSignalMapper(this);
        connect(signalMapper,SIGNAL(mapped(int)),this,SIGNAL(digitClicked(int)));

        for (int i = 0; i < 10; ++i) {
            QString text = QString::number(i);
            buttons[i] = new QPushButton(text, this);
            signalMapper->setMapping(buttons[i], i);
            connect(buttons[i], SIGNAL(clicked()), signalMapper, SLOT(map()));
        }

        createLayout();
    }

http://qt-project.org/doc/qt-5.0/qtcore/qsignalmapper.html

http://doc.qt.digia.com/qq/qq10-signalmapper.html

答案 1 :(得分:0)

在mainwindow.h中添加:

#include <QPushButton>

并添加此原型:

bool isChecked(QPushButton *btn);
在mainwindow.c中

添加此功能:

bool MainWindow::isChecked(QPushButton *btn) {
    if (btn->isChecked())
        return true;
    return false;
}

现在您可以使用此功能检查您的按钮是否已被选中。

P.S。我使用QPushButton作为示例..你必须使用按钮的类型