当前位置: 首页 > article >正文

(二)QT——按钮小程序

目录

前言

按钮小程序

1、步骤

2、代码示例

3、多个按钮

①信号与槽的一对一

②多对一(多个信号连接到同一个槽)

③一对多(一个信号连接到多个槽)

结论


前言


按钮小程序

Qt 按钮程序通常包含 三个核心文件

  • mainwindow.h:主窗口类的声明(定义按钮和槽函数)。
  • mainwindow.cpp:主窗口类的实现(创建按钮并连接信号与槽)。
  • main.cpp:程序入口(运行主窗口)。

在 Qt 中,创建一个简单的按钮小程序(GUI 程序)通常涉及使用 Qt Widgets 库来创建窗口和按钮,并处理按钮的点击事件。以下是一个基础的 Qt 小程序示例,展示如何创建一个带按钮的窗口:

1、步骤

  1. 创建项目:使用 Qt Creator 创建一个 Qt Widgets Application 项目。
  2. 设计界面:在 MainWindow 窗口中添加一个按钮。
  3. 处理事件:连接按钮的点击信号到槽函数,显示消息或者执行其他操作。

2、代码示例

1. mainwindow.ui(界面设计)

  • 打开 Qt Creator 中的 mainwindow.ui 文件,拖拽一个按钮(QPushButton)到窗口中。
2. mainwindow.cpp(功能实现)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 设置按钮文本
    ui->pushButton->setText("点击我");

    // 连接按钮点击信号到槽函数
    connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::onButtonClicked);
}

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

// 按钮点击槽函数
void MainWindow::onButtonClicked()
{
    // 弹出一个消息框
    QMessageBox::information(this, "提示", "苦瓜汤补钙!");
}
3. mainwindow.ui(界面设计)

在 Qt Creator 中使用拖放工具添加一个按钮,并确保按钮的 objectNamepushButton,然后连接信号和槽。

4. mainwindow.h(头文件)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void onButtonClicked(); // 按钮点击的槽函数

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

解释:

  • UI 文件:通过 Qt Creator 的设计器,我们可以直观地设计界面。按钮被命名为 pushButton,并通过信号与槽机制连接点击事件。
  • 槽函数:当按钮被点击时,onButtonClicked 槽函数会被触发,弹出一个消息框 (QMessageBox::information) 来显示提示信息。

构建与运行:

  1. 在 Qt Creator 中点击 编译 (Ctrl + B),然后点击 运行 (Ctrl + R)。
  2. 当窗口显示时,点击按钮会弹出消息框。

这就是一个简单的 Qt 按钮小程序。你可以根据需要修改按钮的行为和界面元素,Qt 提供了丰富的控件和功能,可以帮助你开发各种应用。


3、多个按钮

如果你的 Qt 小程序包含 多个按钮,你可以使用 多个槽函数 或者 使用 QObject::sender() 识别信号发送者 来动态处理多个按钮的点击事件。

注意:Qt的信号与槽机制,可以实现信号与槽的一对一、多对一和一对多。

①信号与槽的一对一

方法 1:为每个按钮创建独立的槽函数

如果每个按钮有不同的功能,你可以分别为它们创建槽函数。

修改 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void onButton1Clicked();
    void onButton2Clicked();
    void onButton3Clicked();

private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

修改 mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 设置按钮文本
    ui->pushButton->setText("按钮 1");
    ui->pushButton_2->setText("按钮 2");
    ui->pushButton_3->setText("按钮 3");

    // 连接信号与槽
    connect(ui->pushButton, &QPushButton::clicked, this, &MainWindow::onButton1Clicked);
    connect(ui->pushButton_2, &QPushButton::clicked, this, &MainWindow::onButton2Clicked);
    connect(ui->pushButton_3, &QPushButton::clicked, this, &MainWindow::onButton3Clicked);
}

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

// 定义槽函数
void MainWindow::onButton1Clicked()
{
    QMessageBox::information(this, "提示", "按钮 1 被点击!");
}

void MainWindow::onButton2Clicked()
{
    QMessageBox::information(this, "提示", "按钮 2 被点击!");
}

void MainWindow::onButton3Clicked()
{
    QMessageBox::information(this, "提示", "按钮 3 被点击!");
}

优点: 代码清晰,每个按钮的逻辑独立。
缺点: 如果按钮很多,代码会变得冗余。

方法 2:手动创建按钮

修改 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void onButton1Clicked();  // 按钮1的槽函数
    void onButton2Clicked();  // 按钮2的槽函数

private:
    Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

修改 mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPushButton>
#include <QDebug>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 创建按钮 1
    QPushButton *pushButton1 = new QPushButton("按钮 1", this);
    pushButton1->setGeometry(50, 50, 100, 30);

    // 创建按钮 2
    QPushButton *pushButton2 = new QPushButton("按钮 2", this);
    pushButton2->setGeometry(50, 100, 100, 30);

    // 连接信号与槽
    connect(pushButton1, &QPushButton::clicked, this, &MainWindow::onButton1Clicked);
    connect(pushButton2, &QPushButton::clicked, this, &MainWindow::onButton2Clicked);
}

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

// 按钮 1 处理函数
void MainWindow::onButton1Clicked()
{
    qDebug() << "按钮 1 被点击";
}

// 按钮 2 处理函数
void MainWindow::onButton2Clicked()
{
    qDebug() << "按钮 2 被点击";
}
运行步骤
  1. 在 Qt Creator 中创建 Qt Widgets 应用程序
  2. 替换 mainwindow.hmainwindow.cppmain.cpp
  3. 点击 Ctrl + R 运行
  4. 点击按钮,观察 Application Output 窗口:

修改 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QMessageBox>  // 添加 QMessageBox 头文件
#include <QPushButton>  // 添加 QPushButton 头文件

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void onButton1Clicked();  // 按钮 1 槽函数
    void onButton2Clicked();  // 按钮 2 槽函数
    void onButton3Clicked();  // 按钮 3 槽函数

private:
    Ui::MainWindow *ui;
    QPushButton *pushButton1;
    QPushButton *pushButton2;
    QPushButton *pushButton3;
};
#endif // MAINWINDOW_H

修改 mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 创建按钮 1
    pushButton1 = new QPushButton("按钮 1", this);
    pushButton1->setGeometry(50, 50, 150, 40);

    // 创建按钮 2
    pushButton2 = new QPushButton("按钮 2", this);
    pushButton2->setGeometry(50, 120, 150, 40);

    // 创建按钮 3
    pushButton3 = new QPushButton("按钮 3", this);
    pushButton3->setGeometry(50, 190, 150, 40);

    // 连接按钮信号到槽函数
    connect(pushButton1, &QPushButton::clicked, this, &MainWindow::onButton1Clicked);
    connect(pushButton2, &QPushButton::clicked, this, &MainWindow::onButton2Clicked);
    connect(pushButton3, &QPushButton::clicked, this, &MainWindow::onButton3Clicked);
}

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

// 按钮 1 槽函数
void MainWindow::onButton1Clicked()
{
    QMessageBox::information(this, "提示", "按钮 1 被点击!");
}

// 按钮 2 槽函数
void MainWindow::onButton2Clicked()
{
    QMessageBox::information(this, "提示", "按钮 2 被点击!");
}

// 按钮 3 槽函数
void MainWindow::onButton3Clicked()
{
    QMessageBox::information(this, "提示", "按钮 3 被点击!");
}

②多对一(多个信号连接到同一个槽)

场景:多个按钮触发同一个槽函数
多个 QPushButton 连接到同一个 clicked() 槽函数,槽函数可以区分是哪个按钮触发的。

QtButtonApp/
│── main.cpp
│── mainwindow.h
│── mainwindow.cpp
│── mainwindow.ui  (如果使用 UI 设计)
│── QtButtonApp.pro

  1. 使用 QSignalMapper(Qt5 可用)或 lambda 表达式(推荐 Qt6)
    • 让多个按钮的 clicked() 信号映射到同一个槽函数,并传递不同的参数
  2. sender() 自动识别哪个按钮触发
    • 通过 QObject::sender() 获取信号来源(触发的按钮)。
    • 获取按钮 text() 或者 objectName() 来区分。

修改 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QMap>  // 用于存储按钮

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void onAnyButtonClicked();  // ✅ 多对一的槽函数

private:
    Ui::MainWindow *ui;
    QMap<QPushButton*, QString> buttonMap;  // 按钮映射(用于存储按钮和它们的名称)
};
#endif // MAINWINDOW_H

修改 mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // ✅ 统一创建多个按钮,并存入 QMap 进行管理
    QStringList buttonNames = {"按钮 1", "按钮 2", "按钮 3"};

    int y = 50;
    for (const QString &name : buttonNames) {
        QPushButton *button = new QPushButton(name, this);
        button->setGeometry(50, y, 100, 40);  // 设置按钮位置
        y += 50;
        buttonMap[button] = name;  // 记录按钮和它的名称

        // ✅ 连接所有按钮到**同一个槽函数**(多对一)
        connect(button, &QPushButton::clicked, this, &MainWindow::onAnyButtonClicked);
    }
}

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

// ✅ **多对一的槽函数**
void MainWindow::onAnyButtonClicked()
{
    QPushButton *button = qobject_cast<QPushButton*>(sender());  // 获取触发的按钮
    if (button && buttonMap.contains(button))
    {
        QMessageBox::information(this, "按钮点击", buttonMap[button] + " kgtbg!");
    }
}

③一对多(一个信号连接到多个槽)

"一对多" 是指 一个信号 连接到多个 槽函数,而不是多个信号连接到一个槽函数。在 Qt 中可以轻松实现这种一对多的机制

  1. 创建一个信号,并连接到多个槽函数
  2. 每个槽函数根据需要处理这个信号。

修改 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void onSlot1();
    void onSlot2();
    void onSlot3();

private:
    Ui::MainWindow *ui;
    QPushButton *button;
};
#endif // MAINWINDOW_H

修改 mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 创建按钮
    button = new QPushButton("点击按钮", this);
    button->setGeometry(50, 50, 120, 40);

    // 直接连接按钮的 clicked 信号到多个槽函数
    connect(button, &QPushButton::clicked, this, &MainWindow::onSlot1);
    connect(button, &QPushButton::clicked, this, &MainWindow::onSlot2);
    connect(button, &QPushButton::clicked, this, &MainWindow::onSlot3);
}

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

// 槽1
void MainWindow::onSlot1()
{
    QMessageBox::information(this, "槽1", "槽1 被触发!");
}

// 槽2
void MainWindow::onSlot2()
{
    QMessageBox::information(this, "槽2", "槽2 被触发!");
}

// 槽3
void MainWindow::onSlot3()
{
    QMessageBox::information(this, "槽3", "槽3 被触发!");
}

如果你想 点击按钮后一次性显示多个信息框,可以用 QMessageBox::information() 直接串联多个调用,也可以用 QMessageBoxexec() 方法让多个消息框同时显示。

方式 1:使用 QMessageBox::information() 串联

一次性弹出多个消息框(但用户需要手动关闭每个消息框)

void MainWindow::onButtonClicked()
{
    QMessageBox::information(this, "提示", "槽1 被触发!");
    QMessageBox::information(this, "提示", "槽2 被触发!");
    QMessageBox::information(this, "提示", "槽3 被触发!");
}

这种方式需要逐个点击“确定”关闭消息框,才能显示下一个。

方式 2:使用 QMessageBox 并行显示多个对话框

一次性显示多个信息框,不用逐个关闭

void MainWindow::onButtonClicked()
{
    QMessageBox *msgBox1 = new QMessageBox(QMessageBox::Information, "提示", "槽1 被触发!", QMessageBox::Ok, this);
    QMessageBox *msgBox2 = new QMessageBox(QMessageBox::Information, "提示", "槽2 被触发!", QMessageBox::Ok, this);
    QMessageBox *msgBox3 = new QMessageBox(QMessageBox::Information, "提示", "槽3 被触发!", QMessageBox::Ok, this);

    msgBox1->show();
    msgBox2->show();
    msgBox3->show();
}

这样可以同时显示多个消息框,用户可以自由关闭,不需要等待一个一个弹出。

方式 3:在一个窗口显示所有信息

如果你不想弹出多个窗口,而是在一个窗口内显示所有信息

void MainWindow::onButtonClicked()
{
    QString message = "槽1 被触发!\n槽2 被触发!\n槽3 被触发!";
    QMessageBox::information(this, "提示", message);
}

下面是一个 完整的 Qt 按钮小程序,包含 一个按钮,点击后会 一次性显示多个信息(方式 3)。

  • 创建 Qt 项目(Qt Widgets Application)。
  • 复制粘贴 mainwindow.hmainwindow.cppmain.cpp 代码。
  • 编译运行,点击按钮即可看到 一个弹窗 显示多个信息。

修改 mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
#include <QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private slots:
    void onButtonClicked(); // 按钮点击槽函数

private:
    Ui::MainWindow *ui;
    QPushButton *button; // 按钮指针
};
#endif // MAINWINDOW_H

修改 mainwindow.cpp

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent), ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    // 创建按钮
    button = new QPushButton("点击我", this);
    button->setGeometry(100, 100, 100, 50); // 设定按钮位置

    // 连接信号和槽
    connect(button, &QPushButton::clicked, this, &MainWindow::onButtonClicked);
}

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

// 按钮点击事件
void MainWindow::onButtonClicked()
{
    // 方式 3:一次性显示多个信息
    QString message = "槽1 被触发!\n槽2 被触发!\n槽3 被触发!";
    QMessageBox::information(this, "提示", message);
}

这样不会弹出多个窗口,体验更好!


结论

Qt 按钮程序主要使用 QPushButton 和信号槽机制
支持一对一、多对一和一对多的信号槽连接
可以创建多个按钮,并让它们共享同一个槽
可以让一个按钮触发多个槽,执行多个操作

🚀 Qt 的按钮程序灵活且强大,适用于多种 GUI 应用场景!


http://www.kler.cn/a/527913.html

相关文章:

  • CSS:跑马灯
  • 数据结构 前缀中缀后缀
  • Autogen_core源码:_agent_runtime.py
  • 0 基础学运维:解锁 K8s 云计算运维工程师成长密码
  • HTML<hgroup>标签
  • 21.3-启动流程、编码风格(了解) 第21章-FreeRTOS项目实战--基础知识之新建任务、启动流程、编码风格、系统配置 文件组成和编码风格(了解)
  • 本地运行大模型效果及配置展示
  • 牛客周赛 Round 77
  • Java 16进制 10进制 2进制数 相互的转换
  • 数据分析系列--⑦RapidMiner模型评价(基于泰坦尼克号案例含数据集)
  • 通过.yml文件创建环境
  • 反射、枚举以及lambda表达式
  • Ubuntu下的Doxygen+VScode实现C/C++接口文档自动生成
  • 想品客老师的第九天:原型和继承
  • Nginx代理
  • 面试回顾——1
  • JAVA实战开源项目:房屋租赁系统(Vue+SpringBoot) 附源码
  • Visual RAG: Expanding MLLM visual knowledge without fine-tuning 论文简介
  • 【文件整理】文件命名、存放、分类建议
  • JDK的动态代理:深入理解与实践
  • keil5如何添加.h 和.c文件,以及如何添加文件夹
  • 安装Maven(安装包+步骤)
  • 扶摇计划--从失业的寒冬,慢慢的走出来
  • PID 温控设计(基于 STC51)
  • 网络工程师 (9)文件管理
  • JavaScript闭包深入剖析:性能剖析与优化技巧