更改 QPushbutton 或 QToolbutton 的图标



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

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

  1. 正常(重复关闭(
  2. 切换状态 1(全部重复(
  3. 切换状态 2(重复一个(

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

任何帮助将不胜感激。

您可以使用一种简单的方法来检查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实现。

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

我不知道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

最新更新