【问题标题】:Change the icon of QPushbutton or QToolbutton更改 QPushbutton 或 QToolbutton 的图标
【发布时间】:2018-08-21 07:36:03
【问题描述】:

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。问题是文档中的方法没有签名。因此,我不知道如何覆盖它,或者即使它是要设置或修改的状态属性。

任何帮助将不胜感激。

【问题讨论】:

标签: python pyqt


【解决方案1】:

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

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 实现。

请注意这里的图标来自资源。因此,最好将您的图标添加到资源文件中。

【讨论】:

    【解决方案2】:

    我不知道QAbstractButton.nextCheckState,但我建议使用Qt的信号/槽机制。

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

    我用MainWindow 类中包含的所有内容整理了一个简单示例。在实际应用程序中,至少会将代码划分为模型和视图。该示例基于 QtCreator 的新建项目向导自动生成的项目。在设计视图中,我添加了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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 2011-05-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多