1. Qt框架简介
Qt
是一个跨平台的C++图形用户界面应用程序开发框架,它包含了丰富的GUI组件
和强大的功能库。本次示例代码展示了Qt的几个核心概念:
QMainWindow
:主窗口类,提供标准的应用程序框架- **
信号与槽
**机制:Qt的核心通信机制 - 基础UI组件:如
QPushButton
、QLineEdit
等 - 消息框:
QMessageBox
的使用
2. 主窗口类定义分析
2.1 头文件保护与命名空间
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
这是标准的头文件保护
宏,防止头文件被多次包含。
QT_BEGIN_NAMESPACE
和QT_END_NAMESPACE
宏定义了Qt的命名空间范围:
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
2.2 主窗口类声明
主窗口继承自QMainWindow
:
class MainWindow : public QMainWindow
{
Q_OBJECT
Q_OBJECT
宏是Qt元对象系统的关键,它使得类能够使用信号与槽
机制。
2.3 构造函数与析构函数
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
- 构造函数采用
parent
参数实现对象树
管理 - 析构函数负责资源清理
2.4 槽函数声明
private slots:
void on_pushButton_clicked();
void on_lineEditTest_textChanged(const QString &);
void on_pushButtonTest_clicked();
slots
关键字声明这些函数可以作为槽函数
接收信号。
3. 信号与槽机制详解
3.1 信号与槽的基本概念
信号(Signal)
:由对象在特定事件发生时发出槽(Slot)
:用于接收和处理信号的函数连接(Connect)
:建立信号与槽的关联
3.2 连接方式示例
代码中展示了两种连接方式:
- 传统SIGNAL/SLOT宏方式:
connect(ui -> ScrollBar, // 信号发送者
SIGNAL(valueChanged(int)), // 发送的信号
ui->labelValue, // 信号接收者
SLOT(setNum(int))); // 接收者要做的事情,槽 (槽函数)
- 新式函数指针方式(注释中):
connect(ui->ScrollBar,
&QScrollBar::valueChanged,
ui->labelValue,
&QLabel::setNum);
3.3 自动连接的命名约定
Qt支持按照特定命名约定
自动连接槽函数:
void on_<object name>_<signal name>(<signal parameters>);
如示例中的:
void on_lineEditTest_textChanged(const QString &str);
void on_pushButton_clicked();
4. UI组件使用分析
4.1 主窗口初始化
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this); // 界面文件组件的初始化
setWindowTitle("游戏登陆"); // 设置窗口标题
}
4.2 QLineEdit文本变化处理
void MainWindow::on_lineEditTest_textChanged(const QString &str)
{
qDebug()<<"收到信号"; // 调试输出
ui->labelValue->setText(str); // 更新标签文本
}
4.3 QPushButton点击处理
void MainWindow::on_pushButton_clicked()
{
QString ret = "亲爱的" + ui -> lineEditName ->
text() + ui -> lineEditJob ->
text() + ", 欢迎来到王者荣耀!";
QMessageBox::information(this, "Welcome!", ret, QMessageBox::Ok);
emit ui -> pushButtonTest -> click(); // 手动发信号
}
- 拼接多个
QLineEdit
的文本 - 使用
QMessageBox
显示信息对话框 - 手动
emit
信号触发另一个按钮的点击事件
5. 应用程序入口分析
int main(int argc, char *argv[])
{
QApplication a(argc, argv); // 应用程序对象
MainWindow w; // 创建主窗口实例
w.show(); // 显示窗口
return a.exec(); // 进入事件循环
}
QApplication
管理应用程序的控制流和主设置a.exec()
启动事件循环
,使程序保持运行
6. 完整代码回顾
6.1 头文件 (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 on_pushButton_clicked();
void on_lineEditTest_textChanged(const QString &);
void on_pushButtonTest_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
6.2 源文件 (mainwindow.cpp)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QMessageBox>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this); // 界面文件组件的初始化
setWindowTitle("游戏登陆");
// 信号和槽的关联
/*connect(ui -> ScrollBar, // 信号发送者
SIGNAL(valueChanged(int)), // 发送的信号
ui->labelValue, // 信号接收者
SLOT(setNum(int))); // 接收者要做的事情,槽 (槽函数)
// 以上的信号和槽,是自动发送信号的,同时在发送信号的时候,自动传参数 */
// 第二种关联方式
// connect(ui->ScrollBar,
// &QScrollBar::valueChanged,
// ui->labelValue,
// &QLabel::setNum); // setNum有两个重载(int 和 double) 报错
// connect(ui->lineEditTest,
// &QLineEdit::textChanged,
// ui->labelValue,
// &QLabel::setText);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_lineEditTest_textChanged(const QString &str)
{
qDebug()<<"收到信号";
ui->labelValue->setText(str);
}
void MainWindow::on_pushButton_clicked()
{
// 单击注册按钮后,就会自动执行
QString ret = "亲爱的" + ui -> lineEditName ->
text() + ui -> lineEditJob ->
text() + ", 欢迎来到王者荣耀!";
QMessageBox::information(this, "Welcome!", ret, QMessageBox::Ok);
emit ui -> pushButtonTest -> click(); // 手动发信号
}
void MainWindow::on_pushButtonTest_clicked()
{
qDebug() << "单击按钮";
}
6.3 主程序入口 (main.cpp)
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv); // 应用程序变量a
MainWindow w; // 创建一个窗口
w.show(); // 显示窗口
return a.exec(); // 进入事件循环, 启动应用程序的死循环
}
通过本文详细分析,我们深入了解了Qt的核心机制信号与槽
、UI组件
的基本使用以及Qt应用程序的基本结构。这些知识是Qt开发的基础,掌握好这些概念对于后续更复杂的Qt开发至关重要。