目录
前言
按钮小程序
1、步骤
2、代码示例
3、多个按钮
①信号与槽的一对一
②多对一(多个信号连接到同一个槽)
③一对多(一个信号连接到多个槽)
结论
前言
按钮小程序
Qt 按钮程序通常包含 三个核心文件:
mainwindow.h
:主窗口类的声明(定义按钮和槽函数)。mainwindow.cpp
:主窗口类的实现(创建按钮并连接信号与槽)。main.cpp
:程序入口(运行主窗口)。
在 Qt 中,创建一个简单的按钮小程序(GUI 程序)通常涉及使用 Qt Widgets 库来创建窗口和按钮,并处理按钮的点击事件。以下是一个基础的 Qt 小程序示例,展示如何创建一个带按钮的窗口:
1、步骤
- 创建项目:使用 Qt Creator 创建一个 Qt Widgets Application 项目。
- 设计界面:在
MainWindow
窗口中添加一个按钮。 - 处理事件:连接按钮的点击信号到槽函数,显示消息或者执行其他操作。
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 中使用拖放工具添加一个按钮,并确保按钮的 objectName
是 pushButton
,然后连接信号和槽。
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
) 来显示提示信息。
构建与运行:
- 在 Qt Creator 中点击 编译 (
Ctrl + B
),然后点击 运行 (Ctrl + R
)。 - 当窗口显示时,点击按钮会弹出消息框。
这就是一个简单的 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 被点击";
}
运行步骤
- 在 Qt Creator 中创建 Qt Widgets 应用程序
- 替换
mainwindow.h
、mainwindow.cpp
和main.cpp
- 点击
Ctrl + R
运行 - 点击按钮,观察
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
- 使用
QSignalMapper
(Qt5 可用)或lambda
表达式(推荐 Qt6):- 让多个按钮的
clicked()
信号映射到同一个槽函数,并传递不同的参数。
- 让多个按钮的
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 中可以轻松实现这种一对多的机制
- 创建一个信号,并连接到多个槽函数。
- 每个槽函数根据需要处理这个信号。
修改 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()
直接串联多个调用,也可以用 QMessageBox
的 exec()
方法让多个消息框同时显示。
方式 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.h
、mainwindow.cpp
和main.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 应用场景!