QT入门学习(一)---新建工程与、信号与槽

article/2025/7/19 16:17:29

一: 新建QT项目

 

 

 

 

 

 二:QT文件构成

 2.1 first.pro

项目管理文件,下面来看代码解析

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11TARGET = main# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS# You can also make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \mainwindow.cppHEADERS += \mainwindow.hFORMS += \mainwindow.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

QT += core gui:引入 Qt 核心库和图形界面库(Qt GUI 模块)。如果需要加入新的库,直接在后面添加即可

greaterThan(QT_MAJOR_VERSION, 4):条件判断,如果 Qt 版本大于 4(即 Qt 5+),则额外引入 widgets 模块(Qt 5 中独立出来的 GUI 组件)。

CONFIG += c++11:启用 C++11 标准支持。

TARGET:指定生成的可执行文件或库的名称(此处为 main)。如果要修改生成的可执行文件名字,就可以直接修改其后面的名字即可。

QT_DEPRECATED_WARNINGS:开启对已弃用 Qt API 的编译警告(建议保留,便于代码迁移)。QT_DISABLE_DEPRECATED_BEFORE=0x060000:禁用 Qt 6.0.0 之前的所有弃用 API(取消注释后,使用这些 API 将导致编译错误)。

SOURCES:列出项目的源文件(.cpp)。HEADERS:列出项目的头文件(.h)。

FORMS:列出 Qt Designer 设计的 UI 文件(.ui),由 uic 工具自动转换为 C++ 代码。

2.2 Headers

 该文件里面存放的就是一些头文件,下面看代码解析

#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:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H

QMainWindow:继承自 Qt 的主窗口基类,提供标准的应用程序框架(菜单栏、工具栏、状态栏等)。

QT_BEGIN_NAMESPACE:Qt 使用命名空间组织代码,此处声明 Ui 命名空间,其中的 MainWindow 类由 Qt Designer 自动生成(对应 .ui 文件)。

Q_OBJECT:Qt 元对象系统的宏,必须包含在所有使用信号与槽的类中。

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

构造函数:接收一个父窗口指针(默认 nullptr,表示顶级窗口)。

析构函数:负责释放资源,通常由 Qt 自动管理(如删除 ui 对象)。

private:Ui::MainWindow *ui;

ui 指针:指向 Qt Designer 生成的 UI 类实例,用于访问界面元素(如按钮、标签等)。

关联方式.ui 文件通过 uic 工具编译为 ui_mainwindow.h,其中定义了 Ui::MainWindow 类。

 2.3 Sources

这里存放的就是项目里的源码C++文件。

2.3.1 main.cpp

入口文件 main.cpp

下面看源码解释

#include "mainwindow.h"#include <QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);MainWindow w;w.show();return a.exec();
}

QApplication a(argc, argv);:创建一个 QApplication 对象 a,它是整个 Qt 应用程序的基础,负责处理命令行参数 argc 和 argv,初始化应用程序的资源管理等。

MainWindow w;:创建一个 MainWindow 类的实例 w,即应用程序的主窗口。

w.show();:调用主窗口对象 w 的 show 方法,将主窗口显示出来。

return a.exec();:启动 Qt 应用程序的事件循环,exec 函数会阻塞并等待事件(如鼠标点击、键盘输入等)发生,处理相应事件并重新调度,直到应用程序退出,然后返回退出码。

2.3.2  mainwindow.cpp

主窗口类的实现文件 mainwindow.cpp

下面看源码解释

#include "mainwindow.h"
#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);
}MainWindow::~MainWindow()
{delete ui;
}
  1. 构造函数
    • MainWindow::MainWindow(QWidget *parent)MainWindow 类的构造函数,接收一个 QWidget 指针作为父窗口(默认为 nullptr,表示顶级窗口)。
    • : QMainWindow(parent):使用初始化列表调用基类 QMainWindow 的构造函数,传递父窗口指针。
    • : ui(new Ui::MainWindow):在初始化列表中创建 Ui::MainWindow 类的实例 ui,用于管理界面。
    • ui->setupUi(this);:在构造函数体中调用 ui 的 setupUi 方法,该方法会根据 .ui 文件中的设计,初始化主窗口的界面元素,将它们添加到主窗口中并进行布局设置等操作。
  2. 析构函数
    • MainWindow::~MainWindow()MainWindow 类的析构函数,当主窗口对象被销毁时自动调用。
    • delete ui;:在析构函数中释放 ui 指针指向的对象,即释放由 Qt Designer 生成的界面相关资源。

2.4 Forms

存放项目内所有界面文件*.ui
 

三:信号与槽

3.1信号

当一个对象状态发生变化时发出的通知。它是一种特殊的函数声明,不需要再类中编写函数,只需要声明即可。当特定事件发生时(比如按钮被点击),信号会被发射(emit)

3.2定义信号

只需要在mianwindow.h里声明信号即可。

3.1.1 声明格式

class MyClass : public QObject
{Q_OBJECT  // 必须包含的宏signals:void mySignal();  // 无参数信号void mySignal(int value);  // 带参数的信号void mySignal(const QString& text, bool ok);  // 多参数信号
};
  1. 必须继承 QObject:信号只能在 QObject 的子类中声明。
  2. 必须包含 Q_OBJECT 宏:该宏启用 Qt 的元对象系统(信号与槽、反射等)。
  3. 信号只需声明,无需实现Qt 会自动生成信号的实现代码
  4. 返回值必须为 void:信号不能有返回值。
  5. 访问控制signals 块默认是 protected,但通常无需在意,因为信号只能通过 emit 调用,不能直接从外部调用。

3.1.2 信号的参数

信号可以携带任意数量和类型的参数,但需满足:

1.参数类型必须是 Qt 元对象系统支持的类型(基本类型、QStringQList 等)。

2.自定义类型需使用 Q_DECLARE_METATYPE 注册(如果用于跨线程信号)。

实例代码如下

// 自定义类型
struct MyData {int value;QString text;
};
Q_DECLARE_METATYPE(MyData)  // 注册元类型class MyClass : public QObject
{Q_OBJECTsignals:void dataChanged(const MyData& data);  // 带自定义参数的信号
};

3.1.3 信号的重载

信号可以重载(同名但参数不同):

signals:void valueChanged();  // 无参数版本void valueChanged(int newValue);  // 带参数版本

3.1.4 信号的继承和重写

信号可以被继承,子类可以:

  1. 直接使用父类的信号
  2. 添加新信号
  3. 重写父类信号:信号重写可能导致复杂的调用关系,应谨慎使用。

实例代码如下:

class Parent : public QObject
{Q_OBJECT
signals:void parentSignal();
};class Child : public Parent
{Q_OBJECT
signals:void childSignal();  // 新增信号
};

3.1.5 发射信号

使用 emit 关键字发射信号

void MyClass::setValue(int value)
{if (m_value != value) {m_value = value;emit valueChanged(m_value);  // 发射信号}
}

3.3 槽

槽是 Qt 对象接收信号的成员函数,本质上是普通的 C++ 成员函数,但可通过信号触发。

3.3.1 特点

1.可重载:同名但参数不同的槽函数可共存。

2.可继承:子类可继承或重写父类的槽。

3.访问控制:槽可以是publicprotectedprivate

4.返回值:通常为void,但也可以有返回值(不过信号无法接收返回值)。

以下两点需要注意:

1. 槽可以是任何成员函数、普通全局函数、静态函数

2. 槽函数和信号的参数和返回值要一致

3.3.2 槽的声明与实现

使用slots关键字,声明代码如下

class MyClass : public QObject
{Q_OBJECTpublic slots:void onButtonClicked();         // 无参数槽void onValueChanged(int value); // 带参数槽protected slots:void updateUI();private slots:void cleanup();
};

实现代码如下

// 在cpp文件中实现槽函数
void MyClass::onButtonClicked()
{qDebug() << "Button clicked!";updateUI();
}void MyClass::onValueChanged(int value)
{m_value = value;emit valueUpdated(m_value); // 槽中也可发射信号
}

3.1.3 信号与槽的连接方式

基本连接格式

connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

sender 是发射信号的对象的名称, signal() 是信号名称。receiver 是接收信号的对象名称, slot() 是槽函数的名称,需要带括号,有参数时还需要指明参数。

1.一个信号可以连接多个槽

2.多个信号可以连接同一个槽

3.当信号和槽函数带有参数时,在 connect()函数里,要写明参数的类型,但可以不写参数名称

3.1.4 槽的参数匹配类型

  1. 参数数量:槽的参数数量 ≤ 信号的参数数量
  2. 参数类型:槽的参数类型必须与信号的对应参数类型 兼容(可隐式转换)。
// 信号声明
void valueChanged(int value, QString text);// 合法的槽参数:
void slot1(int);                // 忽略第二个参数
void slot2(int, QString);       // 完全匹配
void slot3(double, QString);    // int可转换为double// 非法的槽参数:
void slot4(QString);            // 参数类型不匹配
void slot5(int, QString, bool); // 参数数量过多


http://www.hkcw.cn/article/dtxIfDHDQn.shtml

相关文章

自己烧水喝是否比买桶装水更健康 减少微塑料摄入

水是构成人体的重要物质,对维持正常的身体活动和认知能力至关重要。尤其是在天气炎热时,及时补充水分尤为重要。在日常生活中,有人习惯自己烧水喝,也有人因担心自来水水质问题而选择桶装水或瓶装水。那么,这两种饮水方式哪种更健康呢?一项发表在《美国国家科学院院刊》上…

PCB设计教程【强化篇】——USB拓展坞PCB布线

前言 本教程基于B站Expert电子实验室的PCB设计教学的整理&#xff0c;为个人学习记录&#xff0c;旨在帮助PCB设计新手入门。所有内容仅作学习交流使用&#xff0c;无任何商业目的。若涉及侵权&#xff0c;请随时联系&#xff0c;将会立即处理 目录 前言 一、前期准备与规则…

1.RV1126-OPENCV 交叉编译

一.下载opencv-3.4.16.zip到自己想装的目录下 二.解压并且打开 opencv 目录 先用 unzip opencv-3.4.16.zip 来解压 opencv 的压缩包&#xff0c;并且进入 opencv 目录(cd opencv-3.4.16) 三. 修改 opencv 的 cmake 脚本的内容 先 cd platforms/linux 然后修改 arm-gnueabi.to…

黑龙江多地出现罕见粉色极光 梦幻粉紫点亮夜空

6月2日,多位网友在黑龙江省密山市、佳木斯市等地拍摄到了罕见的粉色极光。整个天空被渲染成梦幻般的粉紫色,景象如梦如幻,宛如仙境。一位视频发布者表示,他在6月1日晚上9时左右开始在佳木斯市郊区福胜村江边拍摄,一直持续到次日凌晨1时,使用的是延时摄影技术。他表示,佳…

官方通报!常永春已被“双开” 多次违规接受宴请

中央纪委国家监委官网通报,北京市纪委监委公开了四起违规吃喝典型问题。其中一起涉及北京城建集团有限责任公司原党委书记、董事长常永春。2021年至2024年间,常永春多次在私人会所接受私营企业主安排的宴请,并饮用高档酒水。他还存在其他严重违纪违法问题,最终被开除党籍和…

JS入门——Array

JS入门——Array 一、概述 二、案例代码&#xff08;请自行进行解注释和注释来实现调试&#xff09; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>数组的定义</title> </head> <b…

MySQL读写分离

GTID一主多从搭建异步复制 半同步复制| 机器 | ip | | ------ | -------------- | | master | 192.168.66.143 | | slave1 | 192.168.66.144 | | slave2 | 192.168.66.145 | > 将144的数据复制到145去&#xff0c;删除数据目录下的auto.cnf过程省略读写分离读…

老人花105万元买基金 两年多亏30万元 状告银行求赔偿

一位年过八旬的投资者在2021年投入105万元购买了一只公募基金产品,两年多时间亏损约30万元。该投资者随后诉至法院,要求相关代销银行承担赔偿责任。该案先后经过两次审理。一审法院结合双方的过错程度,判决银行承担70%损失赔偿责任并支付损失利息。二审法院则认为,投资者自…

慈星股份可交债往事撕开资本隐秘角落 内幕操作浮出水面

慈星股份(300307.SZ)在5个月内连推两起重大资产重组,引发市场广泛关注。随着这些动作,公司过去资本运作的内幕逐渐浮出水面。知情人士陈曦举报称,慈星股份控股股东宁波裕人智慧科技(集团)有限公司在2017年发行的可交换债项目中存在违规行为。据称,宁波裕人通过两家第三…

解锁帕金森人群的活力锻炼法

帕金森人群通过科学锻炼&#xff0c;能有效维持身体机能。首先推荐 “原地踏步操”&#xff0c;在家中安全区域踮脚抬高膝盖&#xff0c;配合手臂前后摆动&#xff0c;每次坚持 5 分钟&#xff0c;可增强下肢力量&#xff0c;改善肢体协调性。也可利用墙面进行 “推墙练习”&am…

鏖战近3小时!22岁郑钦文躺地庆祝 首进法网8强创历史

在北京时间6月1日晚结束的法网女单1/8决赛中,中国选手郑钦文经过近3小时的激战,以2-1战胜赛会19号种子萨姆索诺娃,首次跻身法网女单8强。这场胜利让她成为公开赛年代第二位闯入法网单打八强的中国选手。比赛结束后,22岁的郑钦文激动地躺在地上庆祝。作为赛会8号种子,郑钦文…

乌官员:完全摧毁至少13架俄军战机 俄方损失惨重

当地时间6月2日,乌克兰国家安全和国防委员会下属的反虚假信息中心负责人安德烈科瓦连科在其官方社交平台上表示,乌克兰国家安全局代号为“蛛网”的特别行动至少摧毁了13架俄军战机,另有更多战机受损。俄方对此说法暂无回应。乌克兰国家安全局6月1日在社交媒体上宣布,对位于…

冯小刚女儿高中毕业回国 颜值逆袭 气质如母引发热议

冯小刚的女儿徐朵在国外高中毕业,19岁的她身穿红色礼服,在美国的毕业典礼上自信优雅,让不少网友直呼认不出。她的美貌再度成为社交平台的热搜话题。作为冯小刚和徐帆的养女,徐朵的成长轨迹既有“星二代”的光环加持,也充满了跌宕起伏。2025年5月底,在美国普特南学院的毕业…

男子将放学女童拖进小巷 被拘15日 儿童安全再引关注

2025年5月的一个傍晚,湖南某县城的居民楼上传来一阵撕心裂肺的哭喊声。一名6岁女童被陌生男子强行拖入小巷,孩子的哭叫让整栋楼的居民揪心不已。幸运的是,楼上一位退休老教师听到动静后迅速报警,警方赶到后成功解救女童。然而,案件后续的处理结果却引发轩然大波——施暴男…

昆明滇池群鱼跃出水面 持续约1分钟 壮观景象引热议

昆明滇池近日出现了一幕壮观景象,数百条鱼同时跃出水面,持续了大约一分钟。这一场景发生在6月1日,当时气温约为22度。目击者郝先生描述说,场面十分壮观,吸引了许多游客驻足观看。这次群鱼跳跃事件引发了网友们的广泛讨论。有人从迷信的角度出发,认为这是祥瑞之兆,预示着…

PostgreSQL “乱弹” 从索引性能到开发优化

❝ 开头还是介绍一下群&#xff0c;如果感兴趣PolarDB ,MongoDB ,MySQL ,PostgreSQL ,Redis, OceanBase, Sql Server等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;&#xff08;共3000人左右…

商家称六一表演用鞋被批量退货退款 商家贴标防“薅羊毛”

去年“六一”儿童节期间,“商家投诉表演服被大量退货”的话题频繁登上热搜。今年临近“六一”,不少商家在社交平台上分享防范技巧,山东菏泽的周女士就是其中之一。从事童装生意10年的周女士透露,去年某学校购买了300多套演出服,节后全部退回。退回的衣物使用痕迹严重,有的…

力扣每日一题——蛇梯棋

目录 题目链接&#xff1a;909. 蛇梯棋 - 力扣&#xff08;LeetCode&#xff09; 题目描述 解法一&#xff1a;BFS坐标转换 Java写法&#xff1a; C写法&#xff1a; 运行时间 时间复杂度和空间复杂度 总结 题目链接&#xff1a;909. 蛇梯棋 - 力扣&#xff08;LeetCod…

seq2seq 视频截图

【官方双语】编码、解码神经网络&#xff0c;一个视频讲清楚&#xff0c;seq2seq模型_哔哩哔哩_bilibili 【深度学习 搞笑教程】33 Seq2Seq网络 Attention注意力机制 | 草履虫都能听懂 零基础入门 | 持续更新_哔哩哔哩_bilibili 【深度学习】seq2seq模型/Encoder-Decoder模型及…

俄乌会谈前夕 飞出数只 “黑天鹅” 谈判前景蒙阴影

俄乌第二轮谈判定于6月2日在伊斯坦布尔的契拉昂宫举行。这座宫殿历史可追溯至奥斯曼土耳其时期,目前作为酒店使用。关于本次谈判,俄罗斯代表团已抵达土耳其,由总统助理梅金斯基率领。俄方表示将携带一份备忘录草案和其他停火提议。俄方希望在新一轮谈判中讨论和平协议备忘录…