更改 QPushbutton 或 QToolbutton 的图标

Posted

技术标签:

【中文标题】更改 QPushbutton 或 QToolbutton 的图标【英文标题】:Change the icon of QPushbutton or 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(重复一个)

经过研究,我意识到我可能必须覆盖 QAbstractButton.nextCheckState。问题是文档中的方法没有签名。因此,我不知道如何覆盖它,或者即使它是要设置或修改的状态属性。

任何帮助将不胜感激。

【问题讨论】:

其实 documentation for QAbstractButton.nextCheckState. 【参考方案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 mode0;
;

#endif // MAINWINDOW_H

【讨论】:

以上是关于更改 QPushbutton 或 QToolbutton 的图标的主要内容,如果未能解决你的问题,请参考以下文章

Pyqt5 Python3 QPushButton 默认 StrongFocus 颜色或选项卡选择颜色

在悬停并按下时更改 QPushButton 图标

按下时更改 QPushButton 颜色

如何在“QSettings”中保存/更改“QLineEdit”的文本并进行“QPushButton”调用

子 QMenu 中的 QPushButton,悬停时更改背景

启用选中时Qt QPushButton会更改大小