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

news2025/7/24 10:20:40

一: 新建QT项目

 

 

 

 

 

 二:QT文件构成

 2.1 first.pro

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

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

TARGET = 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.0

SOURCES += \
    main.cpp \
    mainwindow.cpp

HEADERS += \
    mainwindow.h

FORMS += \
    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_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    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_OBJECT

signals:
    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_OBJECT

public 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.coloradmin.cn/o/2397424.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UE5.4.4+Rider2024.3.7开发环境配置

文章目录 一、UE5安装 安装有两种方式一种的源码编译安装、一种是EPIC安装&#xff0c;推荐后者&#xff0c;只需要注册一个EPIC账号就可以一键安装。 二、C环境安装 1.下载VisualStudioSetup 下载链接如下下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 选择社…

Windows环境下PHP,在PowerShell控制台输出中文乱码

解决方法&#xff1a; 以管理员运行PowerShell , 输入&#xff1a; chcp 65001 重启控制台&#xff1b;然后就正常输出中文&#xff1b;

性能优化 - 理论篇:性能优化的七类技术手段

文章目录 Pre引言性能优化的七类技术手段性能优化策略一览表1. 复用优化2. 计算优化2.1 并行执行2.2 变同步为异步2.3 惰性加载 3. 结果集优化3.1 数据格式与协议选择3.2 字段精简与按需返回3.3 批量处理与分页3.4 索引与位图加速 4. 资源冲突优化4.1 锁的分类与特点4.2 无锁与…

华为IP(7)

端口隔离技术 产生的背景 1.以太交换网络中为了实现报文之间的二层隔离&#xff0c;用户通常将不同的端口加入不同的VLAN&#xff0c;实现二层广播域的隔离。 2.大型网络中&#xff0c;业务需求种类繁多&#xff0c;只通过VLAN实现二层隔离&#xff0c;会浪费有限的VLAN资源…

AIGC与影视制作:技术革命、产业重构与未来图景

文章目录 一、AIGC技术全景&#xff1a;从算法突破到产业赋能1. **技术底座&#xff1a;多模态大模型的进化路径**2. **核心算法&#xff1a;从生成对抗网络到扩散模型的迭代** 二、AIGC在影视制作全流程中的深度应用1. **剧本创作&#xff1a;从“灵感枯竭”到“创意井喷”**2…

Cursor 玩转 腾讯地图 MCP Server

腾讯地图WebService API 服务简介 腾讯地图WebService API 是基于HTTPS/HTTP协议构建的标准化地理数据服务接口。该接口支持跨平台调用&#xff0c;开发者可使用任意客户端、服务器端技术及编程语言&#xff0c;遵循API规范发起HTTPS请求&#xff0c;获取地理信息服务&#xf…

2025年中国电商618年中大促策略分析:存量博弈与生态重构

图片来源&#xff1a;Photo by Samuel Regan-Asante on Unsplash 中国电商行业正经历一场从「增量扩张」到「存量深耕」的深刻转型。 随着网络购物用户规模突破9.74亿、线上消费渗透率逼近30%的临界点&#xff0c;传统流量红利逐渐消退&#xff0c;行业竞争已从「切蛋糕」转向…

Deepseek给出的8255显示例程

#include <stdio.h> #include <conio.h> #include <dos.h>// 定义8255端口地址 (根据原理图译码确定) #define PORT_8255_A 0x8000 // PA端口地址 #define PORT_8255_B 0x8001 // PB端口地址 #define PORT_8255_C 0x8002 // PC端口地址 #define PORT_8255…

智汇云舟携最新无人机2D地图快速重建技术亮相广西国际矿业展览会

5月22至25日&#xff0c;广西国际矿业展览会&#xff08;以下简称 “矿业展”&#xff09;在南宁国际会展中心成功举办。智汇云舟与合作伙伴广西空驭数智信息技术有限公司携无人机 2D地图快速重建技术&#xff0c;以及视频孪生智慧矿山解决方案参会&#xff0c;为矿山行业数字化…

力扣每日一题——连接两棵树后最大目标节点数目 ||

目录 题目链接&#xff1a;3373. 连接两棵树后最大目标节点数目 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 解法一&#xff1a;​​双树贡献分离法​​ Java写法&#xff1a; C写法&#xff1a; 运行时间 时间复杂度和空间复杂度 总结 题目链接&#xff1a;…

【学习笔记】Sparse Crosscoders for Cross-Layer Features and Model Diffing

Sparse Crosscoders for Cross-Layer Features and Model Diffing Abstract 本说明介绍了稀疏跨编码器(sparse crosscoders)&#xff0c;它是一种稀疏自编码器(sparse autoencoders)或transcoders的变体&#xff0c;旨在用于理解叠加中的模型结构。SAEs是在单一层中编码和预测…

VSCode无法转到定义python源码(ctrl加单击不跳转)

已经尝试的方案&#xff1a; 1.确保对应python环境正确激活 在 VSCode 中&#xff0c;打开命令面板&#xff08;CtrlShiftP&#xff09;&#xff0c;输入并选择 Python: Select Interpreter&#xff0c;然后从列表中选择正确的 Python 解释器。 2.重新卸载Python插件再重新安装…

【华为战报】4月、5月 HCIP考试战报!

了解更多往期考试→点 【考试战报】 华为认证 HCIP 4、5月微思 | HCIP 考试战报 学员成绩单 华为认证 最新开班 厦门面授 全国直播 新生代网工必看&#xff1a;华为模拟器eNSP安装教程&#xff08;附下载链接&#xff09;

AIGC工具平台-GPT-SoVITS-v4-TTS音频推理克隆

声音克隆与语音合成的结合&#xff0c;是近年来生成式AI在多模态方向上的重要落地场景之一。随着预训练模型能力的增强&#xff0c;结合语音识别、音素映射与TTS合成的端到端系统成为初学者可以上手实践的全流程方案。 围绕 GPT-SoVITS-v4-TTS 模块&#xff0c;介绍了其在整合…

el-table配置表头固定而且高度变化

根据官网提示只要在 el-table 元素中定义了 height 属性&#xff0c;即可实现固定表头的表格&#xff0c;而不需要额外的代码。 如果你想既要固定表头&#xff0c;又要下方表格高度自适应&#xff0c;可以设置为 height"100%" &#xff1a; 然后外层设置scroll:

设计模式——组合设计模式(结构型)

摘要 组合设计模式是一种结构型设计模式&#xff0c;用于将对象组合成树形结构以表示“部分-整体”的层次结构&#xff0c;使客户端对单个对象和组合对象具有一致的访问方式。它包含抽象组件、叶子节点和组合节点&#xff0c;具有统一处理、支持递归结构和易扩展等优点&#x…

EMO2:基于末端执行器引导的音频驱动虚拟形象视频生成

今天带来EMO2&#xff08;全称End-Effector Guided Audio-Driven Avatar Video Generation&#xff09;是阿里巴巴智能计算研究院研发的创新型音频驱动视频生成技术。该技术通过结合音频输入和静态人像照片&#xff0c;生成高度逼真且富有表现力的动态视频内容&#xff0c;值得…

Python打卡训练营Day43

DAY 43 复习日 作业&#xff1a; kaggle找到一个图像数据集&#xff0c;用cnn网络进行训练并且用grad-cam做可视化 数据集地址&#xff1a;Lung Nodule Malignancy 肺结核良恶性判断 进阶&#xff1a;并拆分成多个文件 import os import pandas as pd import numpy as np from…

PHP7+MySQL5.6 查立得轻量级公交查询系统

# PHP7MySQL5.6 查立得轻量级公交查询系统 ## 系统简介 本系统是一个基于PHP7和MySQL5.6的轻量级公交查询系统(40KB级)&#xff0c;支持线路查询、站点查询和换乘查询功能。系统采用原生PHPMySQL开发&#xff0c;无需第三方框架&#xff0c;适合手机端访问。 首发版本&#x…

如何做好一个决策:基于 Excel的决策树+敏感性分析应用(针对多个变量)

本文是对《如何做好一个决策:基于 Excel的决策树+敏感性分析应用》一文的补充。 示例背景 决策问题:是否开发新产品? 关键变量: 开发成本(B2):$500K, $700K, $1M高需求概率(B4):30%, 50%, 70%高需求收入(C4