更改QPushbutton或QToolbutton的图标

时间:2018-08-21 07:36:04

标签: python pyqt

QPushbutton等各种状态的图标。

如何设置QPushButton或QToolbutton的图标,使其处于关闭状态和切换状态。

btn1 = QPushButton("Test")
icon1 = QIcon("normal.png")
icon2 = QIcon("toggled.png")
# set the icon for when btn1.toggled returns True
# and when btn1.toggled returns False

创建具有三种状态的QPushbutton

我想创建一个可以具有三种状态的qpushbutton。我正在创建的媒体播放器中使用该按钮。这些是我希望按钮具有的状态:

  1. 正常(重复播放)
  2. 切换状态1(全部重复)
  3. 切换状态2(重复一次)

经研究,我意识到我可能不得不重写QAbstractButton.nextCheckState。问题在于文档中没有该方法的签名。因此,我不知道如何覆盖它,甚至不知道是否是要设置或修改的状态属性。

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

我不了解QAbstractButton.nextCheckState,但我建议使用Qt的信号/时隙机制。

只要模型中重复模式的状态发生变化,就会发出notifyModeChanged之类的信号。将插槽连接到已根据需要设置按钮状态(例如图标)的信号。

我将MainWindow类中包含的所有内容汇总为一个简单示例。在实际应用中,人们至少会将代码分为模型和视图。该示例基于QtCreator的新项目向导的自动生成的项目。在 Design 视图中,我添加了QPushButton

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "ui_mainwindow.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0)  :
        QMainWindow(parent),
        ui(new Ui::MainWindow),
        icon1("icon1.png"),
        icon2("icon2.png"),
        icon3("icon3.png")
    {
        ui->setupUi(this);
        ui->pushButton->setIcon(icon2);

        connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::changeMode);
        connect(this, &MainWindow::notifyModeChanged, this, &MainWindow::modeChanged);
    }

    ~MainWindow() {
        delete ui;
    }

signals:
    void notifyModeChanged();

public slots:
    void changeMode() {
        mode = (mode + 1) % 3;
        emit notifyModeChanged();
    }

    void modeChanged() {
        switch (mode) {
            case 0: ui->pushButton->setIcon(icon1); break;
            case 1: ui->pushButton->setIcon(icon2); break;
            case 2: ui->pushButton->setIcon(icon3); break;
        }
    }

private:
    Ui::MainWindow *ui;

    QIcon icon1;
    QIcon icon2;
    QIcon icon3;

    int mode{0};
};

#endif // MAINWINDOW_H

答案 1 :(得分:0)

您可以使用一种简单的方法来检查checked信号上按钮的clicked()标志。

connect(ui->pushButton, SIGNAL(clicked(bool)), this, SLOT(buttonClicked(bool)));

在您的代码中,将插槽定义为buttonClicked(bool checked)并将其实现为:

void MainWindow::buttonClicked(bool checked)
{
    if ( checked )
        ui->pushButton->setIcon(QIcon(":/on.png"));
    else
        ui->pushButton->setIcon(QIcon(":/off.png"));
}

这也可以相应地用于QToolbutton

并且请注意,此处的图标是从资源中使用的。因此,最好将图标添加到资源文件中。