1

我正在使用 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 种非常相似的方法,而是有一种方法?

4

2 回答 2

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

于 2013-10-13T19:37:28.827 回答
0

在 mainwindow.h 中添加:

#include <QPushButton>

并添加这个原型:

bool isChecked(QPushButton *btn);

在 mainwindow.c 添加这个函数:

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

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

ps 我以 QPushButton 为例.. 你必须使用按钮的类型

于 2013-10-13T19:44:24.113 回答