Qt教程 — 3.1 深入了解Qt 控件:Buttons按钮

目录

1 Buttons按钮简介

1.1 Buttons按钮简介

1.2 Buttons按钮如何选择

2 如何使用Buttons按钮

2.1 QPushButton使用-如何自定义皮肤

2.2 QToolButton使用-如何设置帮助文档

2.3 QRadioButton使用-如何设置开关效果

2.4 QRadioButton使用-如何设置三态选择框

2.5 QCommandLinkButton使用-如何点击转到文件夹

2.6 QDialogButtonBox使用-如何设置链接窗口

3 完整代码


1 Buttons按钮简介

1.1 Buttons按钮简介

在Qt框架中,Buttons控件是用户界面编程中经常使用的一类控件,用于接收用户的点击事件,触发相应的操作。Qt提供了多种按钮控件,以满足不同的使用场景需求。下面是一些常见的Qt按钮控件:

  • QPushButton:QPushButton是最常用的按钮控件,可用于触发一个命令或者操作。它可以显示文本、图标或者两者结合。QPushButton还可以设置为可选中(像切换按钮那样)。

  • QRadioButton:QRadioButton代表单选按钮,通常用于一组选项中选择一个选项的场景。单选按钮之间是互斥的,即在同一组内,选中一个单选按钮将会自动取消选中其他单选按钮。

  • QCheckBox:QCheckBox是复选框控件,用于表示选项的开/关状态。与QRadioButton不同的是,复选框之间是独立的,用户可以同时选中多个复选框。

  • QToolButton:QToolButton是一个通常用于工具栏的按钮。它可以配置为显示一个图标、一个文本或者两者都有。QToolButton可以有不同的行为模式,如自动弹起、菜单模式等。

  • QToggleButton:QToggleButton提供了一个具有两种状态(开和关)的按钮。它类似于QPushButton,但是可以保持按下的状态,直到被再次点击。

1.2 Buttons按钮如何选择

  • 当需要执行一个命令或操作时,使用QPushButton
  • 当在一组选项中需要选择一个时,使用QRadioButton
  • 当需要表示设置或偏好的开/关状态时,使用QCheckBox
  • 在工具栏中提供快速访问操作时,使用QToolButton
  • 当需要一个可以切换状态的按钮时,使用QToggleButton

2 如何使用Buttons按钮

2.1 QPushButton使用-如何自定义皮肤

在2.2节(Qt教程 — 2.1 如何使用Qt Designer 开发UI程序-CSDN博客)我们就已经接触过 QPushButton 了,在 Qt Designer 里连接信号与槽,从而实现了关闭程序的功能。下面开始重新用编写程序的方法实现使用 QPushButton 连接信号和槽实现一个小例子。

(1)在头文件“mainwindow.h”修改代码。1)引入 QPushButton 类 —> 2)声明两个 QPushButton 的对象—>3)声明两个 QPushButton 对象的槽函数。完整代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
// 导入QPushButton 类
#include<QPushButton>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    // 声明两个pushButton
    QPushButton *pushButton1;
    QPushButton *pushButton2;
   
private slots:
    // 声明两个pushButton的槽函数
    void pushButton1_Clicked();
    void pushButton2_Clicked();
};
#endif // MAINWINDOW_H

(2)在头文件“mainwindow.cpp”修改代码。1)设置程序窗口的显示位置和显示大小, 一般出现在中间。—> 2)实例化QPushButton 对象。在初始化的时候可以传入 QString 类型串,作为按钮的显示文本。—> 3)设置按钮的大小和位置。—> 4)连接两个 QPushButton 对象的信号与槽。—> 5)两个 QPushButton 的槽函数实现,设置主窗体的样式表,其中设置background-color 的 rgba 参数即可改变窗体的背景图片。完整代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //设置宽高为 800×480,位置在 0, 0。(0, 0)代表原点, Qt 默认最左上角的点为原点
    this->setGeometry(0, 0, 1000, 600);

    //实例化两个按钮对象,并设置其显示文本为窗口皮肤 1 和窗口皮肤 2
    pushButton1 = new QPushButton("窗口皮肤 1", this);
    pushButton2 = new QPushButton("窗口皮肤 2", this);

    //设定两个 QPushButton 对象的位置
    pushButton1->setGeometry(0,5,80,40);
    pushButton2->setGeometry(100,5,80,40);

    //信号槽连接
    connect(pushButton1, SIGNAL(clicked()), this, SLOT(pushButton1_Clicked()));
    connect(pushButton2, SIGNAL(clicked()), this, SLOT(pushButton2_Clicked()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::pushButton1_Clicked()
{
    // 应用第一张图片作为背景皮肤,调整大小以铺满窗口
    this->setStyleSheet("QMainWindow {background-image: url(/home/qinlong/Qt/04_buttons_example/picture/a8.jpg); background-position: center; background-repeat: no-repeat; background-size: cover;}");
}

void MainWindow::pushButton2_Clicked()
{
    // 应用第二张图片作为背景皮肤,调整大小以铺满窗口
    this->setStyleSheet("QMainWindow {background-image: url(/home/qinlong/Qt/04_buttons_example/picture/r8.jpg); background-position: center; background-repeat: no-repeat; background-size: cover;}");
}

可以通过如下this->setStyleSheet()设置背景图片,函数中参数含义如下:

  • background-position: center; 确保图片在窗口中居中显示。
  • background-repeat:no-repeat: no-repeat; 防止图片在背景中重复显示。如果你希望图片完全填充窗口(可能会导致宽高比变化),可以将background-size设置为100% 100%
  • background-size:属性设置为cover(保持宽高比缩放图片,直到窗口被图片完全覆盖)或contain(保持宽高比缩放图片,直到图片能够完全显示在窗口内部),或者直接设置为100% 100%来强制图片铺满整个窗口但可能会改变图片的宽高比。

(3)运行效果如下:

2.2 QToolButton使用-如何设置帮助文档

工具按钮(QToolButton)区别于普通按钮(QPushButton)的一点是,工具按钮(QToolButton)
可以带图标。这里区别下图标和按钮的背景图片是不一样的。通常我们在 QToolBar 这种工具条
(工具栏)上设置不同的按钮,如果这些按钮还带图标和文本,那么 QToolButton 是个不错的
选择。继续在上面的项目中修改。

(1)在头文件“mainwindow.h”修改代码。1)同样,声明 QToolButton 对象和 QtoolBar 对象。具体代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
// 导入QPushButton类
#include<QPushButton>

// 导入QToolButton 类和QToolBar类
#include <QToolButton>
#include <QToolBar>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    // 声明两个pushButton
    QPushButton *pushButton1;
    QPushButton *pushButton2;

    // 声明一个 QToolButton 对象和QToolBar 对象
    QToolButton *toolButton;
    QToolBar *toolBar;

private slots:
    // 声明两个pushButton的槽函数
    void pushButton1_Clicked();
    void pushButton2_Clicked();
};
#endif // MAINWINDOW_H

(2)在源文件“mainwindow.cpp”修改代码。1)初始化 toolBar(工具条/工具栏)对象,然后初始化 toolButton(工具按钮)对象。—> 2)设置工具按钮的样式。—> 3)最后将 toolButton(工具按钮)添加到 toolBar(工具条/工具栏)上。这样就完成了自定义工具栏的设计。具体代码如下:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStyle>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //设置宽高为 800×480,位置在 0, 0。(0, 0)代表原点, Qt 默认最左上角的点为原点
    this->setGeometry(0, 0, 1000, 600);

    //实例化两个按钮对象,并设置其显示文本为窗口皮肤 1 和窗口皮肤 2
    pushButton1 = new QPushButton("窗口皮肤 1", this);
    pushButton2 = new QPushButton("窗口皮肤 2", this);

    //实例化 QToolBar 对象
    toolBar = new QToolBar(this);
    //实例化 QStyle 类对象,用于设置风格,调用系统类自带的图标
    QStyle *style = QApplication::style();
    //实例化 QToolButton对象
    toolButton = new QToolButton();

    //设定两个 QPushButton 对象的位置
    pushButton1->setGeometry(0,5,120,60);
    pushButton2->setGeometry(130,5,120,60);
    //设置 toolBar 的位置和大小
    toolBar->setGeometry(260, 5, 60,60);

    //信号槽连接
    connect(pushButton1, SIGNAL(clicked()), this, SLOT(pushButton1_Clicked()));
    connect(pushButton2, SIGNAL(clicked()), this, SLOT(pushButton2_Clicked()));


    //使用 Qt 自带的标准图标,可以在帮助文档里搜索 QStyle::StandardPixmap
    QIcon icon = style->standardIcon(QStyle::SP_TitleBarContextHelpButton);
    //设置图标
    toolButton->setIcon(icon);
    //设置要显示的文本
    toolButton->setText("帮助");
    //调用 setToolButtonStyle()方法,设置 toolButoon 的样式,设置为文本置于标下方
    toolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
    //最后将 toolButton 添加到 ToolBar里
    toolBar->addWidget(toolButton);

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::pushButton1_Clicked()
{
    // 应用第一张图片作为背景皮肤,调整大小以铺满窗口
    this->setStyleSheet("QMainWindow {background-image: url(/home/qinlong/Qt/04_buttons_example/picture/a8.jpg); background-position: center; background-repeat: no-repeat; background-size: cover;}");
}

void MainWindow::pushButton2_Clicked()
{
    // 应用第二张图片作为背景皮肤,调整大小以铺满窗口
    this->setStyleSheet("QMainWindow {background-image: url(/home/qinlong/Qt/04_buttons_example/picture/r8.jpg); background-position: center; background-repeat: no-repeat; background-size: cover;}");
}

(3)实现的效果如下:

2.3 QRadioButton使用-如何设置开关效果

QRadioButton 部件提供了一个带有文本标签的单选框(单选按钮)。QRadioButton 是一个可以切换选中(checked)或未选中(unchecked)状态的选项按钮。单选框通常呈现给用户一个“多选一”的选择。也就是说,在一组单选框中,一次只能选中一个单选框。默认在同一个父对象下,初始化后点击它们是互斥状态。

本例将实现手机开关效果,需要使用到Qt 样式表,加载 qss 样式表文件。 这里我们慢慢接触 Qt 的样式表了,正因为有样式表我们才能写一些比较有实际应用的例子和比较炫的例子。在上面的项目文件中继续修改。

(1) 添加资源文件, 按如下步骤。 右键项目—> 选择 Add New…。

(2) 选择一个模板,选择 Qt 模板—>再选择 Qt Resource Files—>点击 Choose。

 (3) 填上资源文件的名称(可随意写一个, 笔者简写为 res),默认添加项目路径下。后面的步
骤默认即可,点击完成。


(4) 新建完成了资源文件后,默认会进入 res.qrc 文件编辑模式(如果关闭了,可以右键这个文
件点击选择“Open in Editor”)。—>点击 Add Prefix 添加前缀(添加前缀的目的是方便分类管理文
件)—>  添加了前缀 /。“/” 一定需要写, 否则会找不到路径。

(5)添加了前缀后,准备两张图片,放在/picture 路径下(文件夹先手动创建)。—> 点击Add Files添加两张照片。—> 添加完成需要按“Ctrl+ S”保存 res.qrc 才会看到左边的结果。添加完成如下图。


Qt样式表(QSS)是一种使用类似于CSS(层叠样式表)的语法来自定义Qt应用程序界面外观的方式。QSS可以用来设置控件的背景颜色、边框、字体等属性。它为Qt应用程序提供了一种强大而灵活的方式来控制UI元素的视觉表现,而无需改动代码逻辑。

(6) 通过如下的方式添加qss文件。右键选中res.qrc文件 —> 添加文件  —> Qt  —> Qt Ressource File —> Choose.

 (7) 新建一个 style.qss 文件,如下图,默认添加到项目的路径下,后面步骤默认即可,直至完成。

(8)  qss 文件添加后如下图。

(9) 在头文件“mainwindow.h”添加如下代码。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

/* 引入 QRadioButton */
#include <QRadioButton>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    /* 声明两个 QRadioButton 对象 */
    QRadioButton *radioButton1;
    QRadioButton *radioButton2;
};
#endif // MAINWINDOW_H

(10) 在源文件“mainwindow.cpp”添加如下代码。

#include "mainwindow.h"

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //设置宽高为 800×480,位置在 0, 0。(0, 0)代表原点, Qt 默认最左上角的点为原点
    this->setGeometry(0, 0, 1000, 600);

    //实例化QRadioButton对象
    radioButton1 = new QRadioButton(this);
    radioButton2 = new QRadioButton(this);

    /* 设置两个 QRadioButton 的位置和显示大小 */
    radioButton1->setGeometry(390, 5, 100, 50);
    radioButton2->setGeometry(500, 5, 100, 50);

    //设置两个 QRadioButton 的显示文本
    radioButton1->setText("开关一");
    radioButton2->setText("开关二");
    // 设置初始状态, radioButton1 的 Checked 为 false,另一个为 true
    radioButton1->setChecked(false);
    radioButton2->setChecked(true);
}
MainWindow::~MainWindow()
{
}

(11) 在源文件“main.cpp”具体代码如下。我们需要在 main.cpp 里加载 qss 文件。添加后的代码如下:

#include <QApplication>
/* 引入 QFile */
#include <QFile>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //指定文件
    QFile file(":/style.qss");
    
    //判断文件是否存在
    if(file.exists()){
        //以只读的方式打开
        file.open(QFile::ReadOnly);
        //以字符串的方式保存读出的结果
        QString styleSheet = QLatin1String(file.readAll());
        //设置全局样式
        qApp->setStyleSheet(styleSheet);
        //关闭文件
        file.close();   
    }
    MainWindow w;
    w.show();
    return a.exec();
}

在源文件“style.qss”具体代码如下,与 HTML 里的 css 语法相似。如果不会写 qss 的内容,
可以参考 Qt 帮助文档的内容,在里面搜索“qt style”。在里面找相关的例子参考,这里我们只
是初步了解下这个 qt style。

<!DOCTYPE RCC>
<RCC version="1.0"/>

QRadioButton{
    spacing: 2px;
    color: white;
}
QRadioButton::indicator {
    width: 45px;
    height: 30px;
}
QRadioButton::indicator:unchecked {
    image: url(:picture/a8.jpg);
}
QRadioButton::indicator:checked {
    image: url(:picture/r8.jpg);
}

运行后的效果如下: 

2.4 QRadioButton使用-如何设置三态选择框

QCheckBox 继承 QAbstractButton。复选按钮(复选框)与 RadioButton 的区别是选择模式,
单选按钮提供多选一,复选按钮提供多选多。
三态选择框,使用一个 QCheckBox,用户通过点击可改变当选择框的状态。在前面的项目基础上进行修改,也可以单独建立项目。

(1) 在头文件“mainwindow.h”中修改代码。导入QCheckBox —> 声明一个 QCheckBox 对象—> 声明 QCheckBox 的槽函数,并带参数传递,用这个参数接收信号的参数。添加的代码如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
// 导入QCheckBox
#include <QCheckBox>

class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    // 声明一个 QCheckBox 对象
    QCheckBox *checkBox;

private slots:
    // 声明 QCheckBox 的槽函数,并带参数传递,用这个参数接收信号的参数
    void checkBoxStateChanged(int);
};
#endif // MAINWINDO

(2) 在源文件“mainwindow.cpp”中修改代码。

#include "mainwindow.h"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //设置宽高为 800×480,位置在 0, 0。(0, 0)代表原点, Qt 默认最左上角的点为原点
    this->setGeometry(0, 0, 1000, 600);
    this->setStyleSheet("QMainWindow {background-color: rgba(200, 50, 100, 100%);}");

    //实例化对象
    checkBox = new QCheckBox(this);

    //设置 QCheckBox 位置和显示大小
    checkBox->setGeometry(630, 5, 300, 50);


    // 初始化三态复选框的状态为 Checked
    checkBox->setCheckState(Qt::Checked);
    // 设置显示的文本
    checkBox->setText("初始化为选项1");
    // 开启三态模式,必须开启,否则只有两种状态,即 Checked 和 Unchecked
    checkBox->setTristate();

    // 连接 checkBox 的信号 stateChanged(int),与我们定义的槽checkBoxStateChanged(int)连接
    connect(checkBox, SIGNAL(stateChanged(int)), this, SLOT(checkBoxStateChanged(int)));
}

MainWindow::~MainWindow()
{
}

// 三态槽函数的实现
void MainWindow::checkBoxStateChanged(int state)
{
    /* 判断 checkBox 的 state 状态,设置 checkBox 的文本 */
    switch (state) {
    case Qt::Checked:
        /* 选中状态 */
        checkBox->setText("选项1");
        break;
    case Qt::Unchecked:
        /* 未选中状态 */
        checkBox->setText("选项2");
        break;
    case Qt::PartiallyChecked:
        /* 半选状态 */
        checkBox->setText("选项3");
        break;
    default:
        break;
    }
}

(3) 在源文件“main.app”中修改代码。main.app与上节相同。

(4) 在源文件“style.qss”中修改代码。

QCheckBox{
    spacing: 5px;
    color: white;
}
QCheckBox::indicator {
    width: 50px;
    height: 50px;
}
QCheckBox::indicator:enabled:unchecked {
    image: url(:/images/unchecked.png);
}
QCheckBox::indicator:enabled:checked {
    image: url(:/images/checked.png);
}
QCheckBox::indicator:enabled:indeterminate {
image: url(:/images/indeterminate.png);
}

(5) 编译程序运行的效果如下, 多次点击 checkBox,即可看到 QCheckBox 的三种状态切换

2.5 QCommandLinkButton使用-如何点击转到文件夹

QCommandLinkButton 控件中文名是“命令链接按钮 ”。 QCommandLinkButton 继承
QPushButton。CommandLinkButton 控件和 RadioButton 相似,都是用于在互斥选项中选择一项。表面上同平面按钮一样,但是 CommandLinkButton 除带有正常的按钮上的文字描述文本外,默认情况下,它也将携带一个箭头图标,表明按下按钮将打开另一个窗口或页面。

(1) 在头文件“mainwindow.h”中修改代码。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
// 导入QCommandLinkButton
#include <QCommandLinkButton>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    // 声明一个 QCommandLinkButton 对象
    QCommandLinkButton *commandLinkButton;

private slots:  
    // 声明槽函数,用于点击 commandLinkButton 后触发
    void commandLinkButtonClicked();
};
#endif // MAINWINDOW_H

(2) 在源文件“mainwindow.cpp”具体代码如下。

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDesktopServices>
#include <QUrl>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //设置宽高为 800×480,位置在 0, 0。(0, 0)代表原点, Qt 默认最左上角的点为原点
    this->setGeometry(0, 0, 1000, 600);
    this->setStyleSheet("QMainWindow {background-color: rgba(255, 255, 255, 100%);}");

    //实例化QCommandLinkButton对象
    commandLinkButton = new QCommandLinkButton("打开/home目录", "点击",this);

    //设置 QCommandLinkButton 位置和显示大小
    commandLinkButton->setGeometry(0, 100, 250, 60);

    //信号槽连接
    connect(commandLinkButton, SIGNAL(clicked()), this, SLOT(commandLinkButtonClicked()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::commandLinkButtonClicked()
{
    //调用系统服务打开/home 目录
    QDesktopServices::openUrl(QUrl("file:home/") );
}

(3)  编译程序运行的效果如下。点击打开/home 目录后,系统将弹出/home 目录路径窗口。

2.6 QDialogButtonBox使用-如何设置链接窗口

对话框和消息框通常以符合该平台界面指导原则的布局呈现按钮。不同平台的对话框总是有不同的布局。 QDialogButtonBox 允许开发人员向其添加按钮,并将自动使用适合用户桌面环境的布局。 也就是说我们可以使用系统的自带的对话框按钮,也可以自己定义对话框按钮。

QDialogButtonBox 常用的按钮有如下几种,

  • QDialogButtonBox::Ok:添加一个“确定”按钮。
  • QDialogButtonBox::Cancel:添加一个“取消”按钮。
  • QDialogButtonBox::Open:添加一个“打开”按钮。
  • QDialogButtonBox::Save:添加一个“保存”按钮。
  • QDialogButtonBox::Close:添加一个“关闭”按钮。
  • QDialogButtonBox::Discard:添加一个“丢弃”按钮,通常用于放弃当前的更改。
  • QDialogButtonBox::Apply:添加一个“应用”按钮,用于应用更改而不关闭对话框。
  • QDialogButtonBox::Reset:添加一个“重置”按钮,将界面恢复到默认或上一次保存的状态。
  • QDialogButtonBox::RestoreDefaults:添加一个“恢复默认设置”按钮,恢复到程序默认的设置。
  • QDialogButtonBox::Help:添加一个“帮助”按钮,通常用于打开帮助文档或提供帮助信息。
  • QDialogButtonBox::SaveAll:添加一个“保存所有”按钮,可能用于保存对多个项目或文件的更改。

(1) 在头文件“mainwindow.h”具体代码如下。

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

// 导入QDialogButtonBox
#include <QDialogButtonBox>
// 导入QPuhsButton
#include <QPushButton>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    // 声明一个 QDialogButtonBox 对象
    QDialogButtonBox *dialogButtonBox;
    // 声明一个 QPushButton 对象
    QPushButton *pushButton;

private slots:
    // 声明信号槽,带 QAbstractButton *参数,用于判断点击了哪个按钮
    void dialogButtonBoxClicked(QAbstractButton *);
};
#endif // MAINWINDOW_H

(2) 在头文件“mainwindow.cpp”修改代码,具体代码如下。

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //设置宽高为 800×480,位置在 0, 0。(0, 0)代表原点, Qt 默认最左上角的点为原点
    this->setGeometry(0, 0, 1000, 600);
    this->setStyleSheet("QMainWindow {background-color: rgba(255, 255, 255, 100%);}");

    //实例化dialogButtonBox对象
    dialogButtonBox = new QDialogButtonBox(this);
    //设置 QdialogButtonBox 位置和显示大小
    dialogButtonBox->setGeometry(300, 200, 200, 30);


    //使用 Qt 的 Cancel 按钮
    dialogButtonBox->addButton(QDialogButtonBox::Cancel);
    //将英文"Cancel"按钮设置为中文"取消"
    dialogButtonBox->button(QDialogButtonBox::Cancel)->setText("取消");
    //设定位置与大小
    pushButton = new QPushButton(tr("自定义"));
    //将 pushButton 添加到 dialogButtonBox,并设定 ButtonRole 为 ActionRole
    dialogButtonBox->addButton(pushButton,
    QDialogButtonBox::ActionRole);
    //信号槽连接,带参数 QAbstractButton *,用于判断用户点击哪个按键
    connect(dialogButtonBox, SIGNAL(clicked(QAbstractButton * )),this, SLOT(dialogButtonBoxClicked(QAbstractButton *)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::dialogButtonBoxClicked(QAbstractButton *button)
{
    //判断点击的对象是否为 QDialogButtonBox::Cancel
    if(button == dialogButtonBox->button(QDialogButtonBox::Cancel)) {
        //打印“单击了取消键” */
        qDebug() <<"单击了取消键"<<endl;
        //判断点击的对象是否为 pushButton
    }else if(button == pushButton) {
        //打印“单击了自定义键”
        qDebug() <<"单击了自定义键"<<endl;
    }
}

(3)  编译程序运行的效果如下。点击自定义按钮和取消按钮,在应用程序输出窗口可以看到对
应的点击事件。

3 完整代码

完整的mainwindow.h文件如下:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
// 导入QPushButton类
#include<QPushButton>

// 导入QToolButton 类和QToolBar类
#include <QToolButton>
#include <QToolBar>

// 导入QRadioButton
#include <QRadioButton>

// 导入QCheckBox
#include <QCheckBox>

// 导入QCommandLinkButton
#include <QCommandLinkButton>

// 导入QDialogButtonBox
#include <QDialogButtonBox>
// 导入QPuhsButton
#include <QPushButton>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    // 声明两个pushButton
    QPushButton *pushButton1;
    QPushButton *pushButton2;

    // 声明一个 QToolButton 对象和QToolBar 对象
    QToolButton *toolButton;
    QToolBar *toolBar;

    // 声明两个 QRadioButton 对象
    QRadioButton *radioButton1;
    QRadioButton *radioButton2;

    // 声明一个 QCheckBox 对象
    QCheckBox *checkBox;

    // 声明一个 QCommandLinkButton 对象
    QCommandLinkButton *commandLinkButton;

    // 声明一个 QDialogButtonBox 对象
    QDialogButtonBox *dialogButtonBox;
    // 声明一个 QPushButton 对象
    QPushButton *pushButton;

private slots:
    // 声明两个pushButton的槽函数
    void pushButton1_Clicked();
    void pushButton2_Clicked();

    // 声明 QCheckBox 的槽函数,并带参数传递,用这个参数接收信号的参数
    void checkBoxStateChanged(int);

    // 声明槽函数,用于点击 commandLinkButton 后触发
    void commandLinkButtonClicked();

    // 声明信号槽,带 QAbstractButton *参数,用于判断点击了哪个按钮
    void dialogButtonBoxClicked(QAbstractButton *);
};
#endif // MAINWINDOW_H

完整的main.cpp文件如下:

#include "mainwindow.h"

#include <QApplication>
/* 引入 QFile */
#include <QFile>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //指定文件
    QFile file(":/style.qss");

    //判断文件是否存在
    if(file.exists()){
        //以只读的方式打开
        file.open(QFile::ReadOnly);
        //以字符串的方式保存读出的结果
        QString styleSheet = QLatin1String(file.readAll());
        //设置全局样式
        qApp->setStyleSheet(styleSheet);
        //关闭文件
        file.close();
    }
    MainWindow w;
    w.show();
    return a.exec();
}

完整的mainwindow.cpp文件如下: 

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QStyle>
#include <QDesktopServices>
#include <QUrl>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    //设置宽高为 800×480,位置在 0, 0。(0, 0)代表原点, Qt 默认最左上角的点为原点
    this->setGeometry(0, 0, 1000, 600);
    this->setStyleSheet("QMainWindow {background-color: rgba(255, 255, 255, 100%);}");

    //实例化两个按钮对象,并设置其显示文本为窗口皮肤 1 和窗口皮肤 2
    pushButton1 = new QPushButton("窗口皮肤 1", this);
    pushButton2 = new QPushButton("窗口皮肤 2", this);

    //实例化 QToolBar 对象
    toolBar = new QToolBar(this);
    //实例化 QStyle 类对象,用于设置风格,调用系统类自带的图标
    QStyle *style = QApplication::style();
    //实例化 QToolButton对象
    toolButton = new QToolButton();
    //实例化QRadioButton对象
    radioButton1 = new QRadioButton(this);
    radioButton2 = new QRadioButton(this);
    //实例化QCheckBox对象
    checkBox = new QCheckBox(this);
    //实例化QCommandLinkButton对象
    commandLinkButton = new QCommandLinkButton("打开/home目录", "点击",this);
    //实例化dialogButtonBox对象
    dialogButtonBox = new QDialogButtonBox(this);

    //设定两个 QPushButton 对象的位置
    pushButton1->setGeometry(0,5,120,60);
    pushButton2->setGeometry(130,5,120,60);
    //设置 toolBar 的位置和大小
    toolBar->setGeometry(260, 5, 60,60);
    //设置两个 QRadioButton 的位置和显示大小
    radioButton1->setGeometry(390, 5, 100, 50);
    radioButton2->setGeometry(500, 5, 100, 50);
    //设置 QCheckBox 位置和显示大小
    checkBox->setGeometry(630, 5, 300, 50);
    //设置 QCommandLinkButton 位置和显示大小
    commandLinkButton->setGeometry(0, 100, 250, 60);
    //设置 QdialogButtonBox 位置和显示大小
    dialogButtonBox->setGeometry(300, 200, 200, 30);

    //信号槽连接
    connect(pushButton1, SIGNAL(clicked()), this, SLOT(pushButton1_Clicked()));
    connect(pushButton2, SIGNAL(clicked()), this, SLOT(pushButton2_Clicked()));

    //使用 Qt 自带的标准图标,可以在帮助文档里搜索 QStyle::StandardPixmap
    QIcon icon = style->standardIcon(QStyle::SP_TitleBarContextHelpButton);
    //设置图标
    toolButton->setIcon(icon);
    //设置要显示的文本
    toolButton->setText("帮助");
    //调用 setToolButtonStyle()方法,设置 toolButoon 的样式,设置为文本置于标下方
    toolButton->setToolButtonStyle(Qt::ToolButtonTextUnderIcon);
    //最后将 toolButton 添加到 ToolBar里
    toolBar->addWidget(toolButton);

    //设置两个 QRadioButton 的显示文本
    radioButton1->setText("开关一");
    radioButton2->setText("开关二");
    // 设置初始状态, radioButton1 的 Checked 为 false,另一个为 true
    radioButton1->setChecked(false);
    radioButton2->setChecked(true);

    // 初始化三态复选框的状态为 Checked
    checkBox->setCheckState(Qt::Checked);
    // 设置显示的文本
    checkBox->setText("初始化为选项1");
    // 开启三态模式,必须开启,否则只有两种状态,即 Checked 和 Unchecked
    checkBox->setTristate();
    // 连接 checkBox 的信号 stateChanged(int),与我们定义的槽checkBoxStateChanged(int)连接
    connect(checkBox, SIGNAL(stateChanged(int)), this, SLOT(checkBoxStateChanged(int)));

    //信号槽连接
    connect(commandLinkButton, SIGNAL(clicked()), this, SLOT(commandLinkButtonClicked()));

    //使用 Qt 的 Cancel 按钮
    dialogButtonBox->addButton(QDialogButtonBox::Cancel);
    //将英文"Cancel"按钮设置为中文"取消"
    dialogButtonBox->button(QDialogButtonBox::Cancel)->setText("取消");
    //设定位置与大小
    pushButton = new QPushButton(tr("自定义"));
    //将 pushButton 添加到 dialogButtonBox,并设定 ButtonRole 为 ActionRole
    dialogButtonBox->addButton(pushButton,
    QDialogButtonBox::ActionRole);
    //信号槽连接,带参数 QAbstractButton *,用于判断用户点击哪个按键
    connect(dialogButtonBox, SIGNAL(clicked(QAbstractButton * )),this, SLOT(dialogButtonBoxClicked(QAbstractButton *)));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::pushButton1_Clicked()
{
    // 应用第一张图片作为背景皮肤,调整大小以铺满窗口
    this->setStyleSheet("QMainWindow {background-image: url(/home/qinlong/Qt/04_buttons_example/picture/a8.jpg); background-position: center; background-repeat: no-repeat; background-size: cover;}");
}

void MainWindow::pushButton2_Clicked()
{
    // 应用第二张图片作为背景皮肤,调整大小以铺满窗口
    this->setStyleSheet("QMainWindow {background-image: url(/home/qinlong/Qt/04_buttons_example/picture/r8.jpg); background-position: center; background-repeat: no-repeat; background-size: cover;}");
}

// 三态槽函数的实现
void MainWindow::checkBoxStateChanged(int state)
{
    /* 判断 checkBox 的 state 状态,设置 checkBox 的文本 */
    switch (state) {
    case Qt::Checked:
        /* 选中状态 */
        checkBox->setText("选项1");
        break;
    case Qt::Unchecked:
        /* 未选中状态 */
        checkBox->setText("选项2");
        break;
    case Qt::PartiallyChecked:
        /* 半选状态 */
        checkBox->setText("选项3");
        break;
    default:
        break;
    }
}

void MainWindow::commandLinkButtonClicked()
{
    //调用系统服务打开/home 目录
    QDesktopServices::openUrl(QUrl("file:home/") );
}

void MainWindow::dialogButtonBoxClicked(QAbstractButton *button)
{
    //判断点击的对象是否为 QDialogButtonBox::Cancel
    if(button == dialogButtonBox->button(QDialogButtonBox::Cancel)) {
        //打印“单击了取消键” */
        qDebug() <<"单击了取消键"<<endl;
        //判断点击的对象是否为 pushButton
    }else if(button == pushButton) {
        //打印“单击了自定义键”
        qDebug() <<"单击了自定义键"<<endl;
    }
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/456810.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

吴恩达deeplearning.ai:独热编码One-hot连续有价值的特征回归树

以下内容有任何不理解可以翻看我之前的博客哦&#xff1a;吴恩达deeplearning.ai专栏 文章目录 One-hot编码连续有价值的特征回归树 在之前的决策树例子中&#xff0c;每个分裂都只有两种选择&#xff0c;但是今天我们将提到一种新的分裂方式叫做One-hot&#xff0c;可以解决以…

【Cookie和Session辨析】

1.cookie 1.1什么是cookie Cookie 是一种在客户端&#xff08;通常是 Web 浏览器&#xff09;和服务器之间传递信息的机制&#xff0c;用于在客户端存储少量的数据。它由服务器发送到客户端浏览器&#xff0c;然后浏览器会将这些数据存储在本地&#xff0c;并在后续的请求中将…

力扣热题100_矩阵_73_矩阵置零

文章目录 题目链接解题思路解题代码 题目链接 73.矩阵置零 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&…

基于Java+SpringBoot+vue的图书购物商城系统详细设计和实现

基于JavaSpringBootvue的图书购物商城系统详细设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文…

linux sshd_config配置说明

[root01 ssh]# cat sshd_config #######################SSH Base Config################## #######通过OpenSSH工具入xshell连接默认端口 可以改成其他默认是22 PAM 认证过程 1&#xff09;使用者执行/usr/bin/passwd程序&#xff0c;并输入密码。 2&#xff09;passwd开…

热点篇(三)-促进传统地产的数字化、网络化和智能化转型

在全国两会召开之际&#xff0c;两会代表纷纷建言“数字化”&#xff0c;全国人大代表、58同城CEO姚劲波指出&#xff0c;在数字中国的大背景下&#xff0c;房地产行业也需要将新的技术与传统地产相融合&#xff0c;从数字基建、数字管理到智能化开发等各个环节实现数字化的流程…

C语言之文件操作(万字详解)

个人主页&#xff08;找往期文章包括但不限于本期文章中不懂的知识点&#xff09;&#xff1a; 我要学编程(ಥ_ಥ)-CSDN博客 目录 前言 文件的打开和关闭 流和标准流 文件指针 文件的打开和关闭 文件的顺序读写 顺序读写函数介绍 fputc的使用 fgetc的使用 fput…

为什么大口径管材产线中使用大直径测径仪?

关键词&#xff1a;测径仪, 管材测径仪, 外径检测, 大口径管材测径仪, 大口径测径仪 在一个繁忙的钢管制造工厂里&#xff0c;生产线上的钢管正源源不断地被制造出来。然而&#xff0c;工程师们发现了一个问题&#xff1a;由于测量误差&#xff0c;部分钢管的直径不符合规格&am…

【学一点RISC-V】RISC-V IMSIC

IMSIC RISC-V AIA 文档 第三章 Incoming MSI Controller (IMSIC) 传入 MSI 控制器&#xff08;IMSIC&#xff09;是一个可选的 RISC-V 硬件组件&#xff0c;与 hart 紧密相连&#xff0c;每个 hart 有一个 IMSIC。IMSIC 接收并记录 Hart 的传入消息信号中断 (MSI)&#xff0c;并…

P5016 [NOIP2018 普及组] 龙虎斗

1.思路 1.先计算包含天降神兵的势力 #include <iostream> using namespace std; int main(){long long n;cin >> n;long long c[n+10];for (long long i= 1; i <= n; i++){cin >> c[i];} long long m,p1,s1,s2;cin >> m >> p1 >> s1…

C++类和对象一

#include <iostream> using namespace std;//设计一个学生类 class CStudent {public: //公有成员void InputData(){cout << "请输入学号";cin >> sno;cout << "请输入姓名";cin >> sname;cout << "请输入分…

2024年最新腾讯云优惠券获得方法整理

腾讯云作为国内领先的云服务提供商&#xff0c;其优质的产品和服务深受用户喜爱。而腾讯云优惠券则是用户在使用腾讯云服务时能够享受到的一项福利&#xff0c;可以有效降低上云成本。那么&#xff0c;2024年如何获得腾讯云优惠券呢&#xff1f;本文将为大家详细整理最新腾讯云…

U盘启动盘 制作Linux Ubuntu CentOS系统启动盘 系统安装

U盘启动盘 制作Linux Ubuntu CentOS系统启动盘 系统安装 准备条件 准备一个U盘&#xff0c;建议容量至少为8GB&#xff0c;以便存放系统镜像文件 一台已经安装好操作系统的计算机&#xff0c;用于制作U盘启动盘 Ubuntu和CentOS的Linux ISO镜像文件。可以从官方网站或相关资源…

Hadoop大数据应用:NFS网关 连接 HDFS集群

目录 一、实验 1.环境 2.NFS网关 连接 HDFS集群 3. NFS客户端挂载HDFS文件系统 二、问题 1.关闭服务报错 2.rsync 同步报错 3. mount挂载有哪些参数 一、实验 1.环境 &#xff08;1&#xff09;主机 表1 主机 主机架构软件版本IP备注hadoop NameNode &#xff08;…

chatGPT的耳朵!OpenAI的开源语音识别AI:Whisper !

语音识别是通用人工智能的重要一环&#xff01;可以说是AI的耳朵&#xff01; 它可以让机器理解人类的语音&#xff0c;并将其转换为文本或其他形式的输出。 语音识别的应用场景非常广泛&#xff0c;比如智能助理、语音搜索、语音翻译、语音输入等等。 然而&#xff0c;语音…

Leetcode-热题100-持续更新

时间不够&#xff0c;只能背诵哎&#xff0c;没办法&#xff0c;难题不写&#xff0c;简单题和中等题。 def majorityElement(nums):# 使用字典 count 来记录每个元素的出现次数count {}for num in nums:if num in count:count[num] 1else:count[num] 1length len(nums)#…

08-java基础-锁之AQSReentrantLockBlockingQueueCountDownLatchSemapho

文章目录 0&#xff1a;AQS简介-常见面试题AQS具备特性state表示资源的可用状态AQS定义两种资源共享方式AQS定义两种队列自定义同步器实现时主要实现以下几种方法&#xff1a;同步等待队列条件等待队列 1&#xff1a;AQS应用之ReentrantLockReentrantLock如何实现synchronized不…

Jsp在Javaweb中扮演什么角色?

1.什么是Jsp JSP&#xff08;Java Server Pages&#xff0c;Java 服务器页面&#xff09;是一种动态网页技术&#xff0c;它允许在 HTML 页面中嵌入 Java 代码&#xff0c;并由 Web 服务器在请求页面时动态生成 HTML 页面。JSP 通常用于创建动态 Web 内容&#xff0c;如交互式表…

开关电源的线性调整率是什么?怎么检测线性调整率?

开关电源线性调整率 开关电源线性调整率是指输入电压在额定范围内变化时&#xff0c;开关电源输出电压随之变化的比率。线性调整率对开关电源的电压稳定性有着重要影响&#xff0c;通常开关电源的线性调整率在1%~5%之间。线性调整率越小&#xff0c;说明电压越稳定&#xff1b;…

【SpringCloud微服务实战08】RabbitMQ 消息队列

MQ异步通信优缺点: 优点: 吞吐量提升:无需等待订阅者处理完成,响应更快速 故障隔离:服务没有直接调用,不存在级联失败问题 调用间没有阻塞,不会造成无效的资源占用 耦合度极低,每个服务都可以灵活插拔,可替换 流量削峰:不管发布事件的流量波动多大,都由Broker接收,…