(二)QT——按钮小程序

devtools/2025/2/4 6:48:56/

目录

前言

按钮小程序

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_OBJECTpublic: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_OBJECTpublic: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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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);// 创建按钮 1QPushButton *pushButton1 = new QPushButton("按钮 1", this);pushButton1->setGeometry(50, 50, 100, 30);// 创建按钮 2QPushButton *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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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);// 创建按钮 1pushButton1 = new QPushButton("按钮 1", this);pushButton1->setGeometry(50, 50, 150, 40);// 创建按钮 2pushButton2 = new QPushButton("按钮 2", this);pushButton2->setGeometry(50, 120, 150, 40);// 创建按钮 3pushButton3 = 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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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_NAMESPACEclass MainWindow : public QMainWindow
{Q_OBJECTpublic: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.ppmy.cn/devtools/155933.html

相关文章

ICANN 关闭 WHOIS Port 43

2025年1月28日&#xff0c;ICANN&#xff08;互联网名称与数字地址分配机构&#xff09;将正式终止WHOIS Port 43服务。这一决定标志着网络安全行业、域名注册机构以及依赖域名数据进行运营或调查的所有人迎来重要变革。那么&#xff0c;这一变化意味着什么&#xff1f;它将如何…

解锁豆瓣高清海报(一) 深度爬虫与requests进阶之路

前瞻 PosterBandit 这个脚本能够根据用户指定的日期&#xff0c;爬取你看过的影视最高清的海报&#xff0c;然后使用 PixelWeaver.py 自动拼接成指定大小的长图。 你是否发现直接从豆瓣爬取下来的海报清晰度很低&#xff1f; 使用 .pic .nbg img CSS 选择器&#xff0c;在 我…

[EAI-023] FAST,机器人动作专用的Tokenizer,提高VLA模型的能力和训练效率

Paper Card 论文标题&#xff1a;FAST: Efficient Action Tokenization for Vision-Language-Action Models 论文作者&#xff1a;Karl Pertsch, Kyle Stachowicz, Brian Ichter, Danny Driess, Suraj Nair, Quan Vuong, Oier Mees, Chelsea Finn, Sergey Levine 论文链接&…

C语言教学第三课:运算符与表达式

一、课程导入 同学们&#xff0c;上节课我们学习了变量和数据类型&#xff0c;这些是C语言的基础。今天&#xff0c;我们将继续深入学习C语言中的运算符与表达式。运算符是C语言中用于执行各种操作的符号&#xff0c;而表达式则是由变量、常量和运算符组成的有意义的组合。通过…

本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操

本地部署DeepSeek开源多模态大模型Janus-Pro-7B实操 Janus-Pro-7B介绍 Janus-Pro-7B 是由 DeepSeek 开发的多模态 AI 模型&#xff0c;它在理解和生成方面取得了显著的进步。这意味着它不仅可以处理文本&#xff0c;还可以处理图像等其他模态的信息。 模型主要特点:Permalink…

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.6 广播机制核心算法:维度扩展的数学建模

2.6 广播机制核心算法&#xff1a;维度扩展的数学建模 目录/提纲 #mermaid-svg-IfELXmhcsdH1tW69 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IfELXmhcsdH1tW69 .error-icon{fill:#552222;}#mermaid-svg-IfELXm…

基于微信小程序的电子竞技信息交流平台设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

Flutter Scaffold 页面结构

Material是一套设计风格&#xff0c;提供了大量的小部件&#xff0c;这里用Material风格搭建一个常见的应用页面结构。 创建Material应用 import package:flutter/material.dart;class App extends StatelessWidget {overrideWidget build(BuildContext context) {return Mat…