QT-项目创建

news2024/9/24 23:24:57

项目创建

注意: 项目创建,名称和路径不能包含中文路径。

创建窗口三大基类

  1. QWidhet
  2. QMainWindow
  3. QDialog

1.1 项目文件介绍

mian.cpp 介绍

#include "mywidget.h"
#include <QApplication> // QApplication 应用程序类

// 程序入口 命令行变量数量     命令行变量数组
int main(int argc, char *argv[])
{
    // a 应用程序对象 在Qt中,应用程序对象有且仅有一个
    QApplication a(argc, argv);
    // 窗口类
    myWidget w;
    // 窗口默认不弹出, 使用show类方法显示窗口
    w.show();
    // a.exec(); 进入消息循环机制 阻塞
    return a.exec();
}

.pro文件 介绍

注意:如果不知道你在干什么,不要改动.pro文件内容!!!,项目会自动追加,不需要手动填写

#-------------------------------------------------
#
# Project created by QtCreator 2022-07-27T16:11:54
#
#-------------------------------------------------

QT       += core gui	// Qt包含的模块

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets		// Qt版本大于4,加入widgets模块

TARGET = mywidget	// 生成的.exe程序名称
TEMPLATE = app		// 默认应用程序模板

SOURCES += \      
        main.cpp \   // 源文件
        mywidget.cpp

HEADERS += \
        mywidget.h	// 头文件

mywifget.h文件

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>

class myWidget : public QWidget // 共有继承 从父类Qwidget中
{
    Q_OBJECT // Q_OBJECT 宏 支持信号和槽

public:
    myWidget(QWidget *parent = 0); // 构造函数 parent默认值0
    ~myWidget();
};

#endif // MYWIDGET_H

mywidget.cpp文件

#include "mywidget.h"

myWidget::myWidget(QWidget *parent) // 基类
    : QWidget(parent)
{
}

myWidget::~myWidget()
{
}

1.2 命名规范

类名 首字母大写,单词之间首字母大写

**变量名、函数名 **首字母小写

1.3 快捷键

运行 CTRL + R

编译 CTRL + B

查找 CTRL + F

注释 CTRL + /

帮助文档 F1 、左侧列表中的帮助、C:\Qt\Qt5.9.0\5.9\mingw53_32\bin\assistant.exe

字体缩放 CTRL + 鼠标滚轮

整行代码移动 CTRL + shift + ↑ ↓

自动对齐 CTRL + i

同名之间.h 和.cpp 之间切换 F4

1.4 对象树

QObject是Qt里边绝大部分类的根类

  • QObject对象之间是以对象树的形式组织起来的

    • 当两个QObject(或子类)的对象建立了父子关系的时候。子对象就会加入到父对象的一个成员变量叫children(孩子)的list(列表)中。
    • 父对象析构的时候,这个列表中的所有对象也会被析构。(注意,这里是说父对象和子对象,不要理解成父类和子类)
  • QWidget是能够在屏幕上显示的一切组件的父类

    • QWidget继承自QObject,因此也继承了这种对象树关系。一个孩子自动地成为父组件的一个子组件。我们向某个窗口中添加了一个按钮或者其他控件(建立父子关系),当用户关闭这个窗口的时候,该窗口就会被析构,之前添加到他上边的按钮和其他控件也会被一同析构。这个结果也是我们开发人员所期望的。
    • 当然,我们也可以手动删除子对象。当子对象析构的时候会发出一个信号destroyed,父对象收到这个信号之后就会从children列表中将它剔除。比如,当我们删除了一个按钮时,其所在的主窗口会自动将该按钮从其子对象列表(children)中删除,并且自动调整屏幕显示,按钮在屏幕上消失。当这个窗口析构的时候,children列表里边已经没有这个按钮子对象,所以我们手动删除也不会引起程序错误。

Qt 引入对象树的概念,在一定程度上简化了内存回收机制,当创建的对象指定的基类时由QObject或者Object派生类的时候,这个对象被加载到对象树上,当窗口关闭时,树上的对象也被释放掉。

对象树中对象的顺序是没有定义的。这意味着,销毁这些对象的顺序也是未定义的。任何对象树中的 QObject对象 delete 的时候,如果这个对象有 parent,则自动将其从 parent 的children()列表中删除;如果有孩子,则自动 delete 每一个孩子。Qt 保证没有QObject会被 delete 两次,这是由析构顺序决定的。

// 设置窗口
#include "mywidget.h"
#include <QPushButton>


myWidget::myWidget(QWidget *parent)
    : QWidget(parent)
{
    // 按钮
    QPushButton * btn = new QPushButton;
    // btn->show(); // show() 用顶层的方式弹出

    //如果想显示到当前窗口中,需要做依赖,加入对象树中
    btn->setParent(this); // this指针就是指向当前类的指针

    // 显示文本
    btn->setText("德玛西亚");

    // 按钮2 声明同时进行初始化
    QPushButton * btn2 = new QPushButton("Second", this);

    // 移动btn2,使用重载版本
    btn2->move(100, 100);

    // 配置窗口大小
    resize(600, 400);
    //设置窗口固定大小,设置后不可以通过拖拽调整窗口大小
    setFixedSize(600,600);

    // 按钮配置大小
    btn->resize(200, 100);

    // 指定窗口标题
    setWindowTitle("第一个窗口");

    // 创建自定义按钮
    MyPushButton *myBtn = new MyPushButton;
    myBtn->setParent(this);
    myBtn->setText("我的按钮");
    myBtn->move(200,200);

}

myWidget::~myWidget()
{
    // 先调用子对象的析构函数,再调用父对象的析构函数,
    // 但是打印时可能会出现先打印父对象析构执行提示,但是父对象还未释放完毕。再打印子对象析构执行提示
    qDebug() << "MyWidget 析构调用。";
}

1.5 坐标系

坐标系左上角为(0,0),向右x为正,向下y为正。

1.6 信号槽

信号:各种事件

槽:响应信号的动作

当某个事件发生后,如某个按钮被点击了一下,就会发出一个被点击的信号(signal)。

某个对象接受到这个信号之后,就会做出一些相关的处理动作(称为槽slot)。

但是Qt对象不会无缘无故的收到某个信号,要想让一个对象收到另一个对象发出的信号,这时候需要建立连接(connect)。

1.6.1 系统自带的信号和槽

connect 函数是建立信号发送者、信号、信号接收者、槽 四者关系的函数:

connect (sender, signal, receiver, slot);

  • 参数:
    • sender : 信号发送者
    • signal :信号
    • receiver :信号接收者
    • slot :接受对象在收到信号之后所需要调用的函数(槽函数

注意:四个参数均为指针类型,信号和槽是函数指针。

// 创建一个关闭按钮
QPushButton *quitBtn = new QPushButton("关闭窗口", this);
// 信号槽的使用
connect(quitBtn, &QPushButton::clicked, this, &MyWidget::close);

利用帮助文档,输入QPushButton,在Content中寻找signal。如果没有就去父类中寻找该关键字。

在QAbstractButton中可以找到信号关键字,系统自带的信号有如下几个:

1.6.2 自定义信号和槽

自定义信号使用条件

  • 自定义信号声明在类的signals域下
  • 没有返回值,为void类型的函数
  • 只有函数声明,没有定义
  • 可以有参数,可以重载
  • 通过emit关键字来触发信号,形式:emit object->sig(参数);

自定义槽函数使用条件

  • qt4 必须声明在 private/public/protected slots域下面,qt5之后可以声明public下,同时还可以是静态的成员函数,全局函数,lambda表达式

  • 没有返回值,void类型的函数

  • 不仅有声明,还得要有实现

  • 可以有参数,可以重载

案例:

定义场景:下课了,老师跟同学说肚子饿了(信号),学生请老师吃饭(槽)

首先定义一个学生类和老师类;

老师类中声明信号 饿了 hungry

// teacher.h
   signal:
		void hungry();

学生类中声明槽函数 请客 treat 并实现

// student.h
	public slot:
		void treat();
// student.cpp 槽函数实现
void Student::treat(){
    qDebug() << "请老师吃饭";
}

在窗口中声明一个公共方法下课,这个方法的调用会触发老师饿了这个信号,而响应槽函数学生请客

// widget.h 声明
public:
	void ClassIsOver();

// widget.cpp 实现
void MyWidget::ClassIsOver()
{
    // 触发自定义信号
    emit teacher->hungry();
}

学生响应了槽函数,并且打印信息

// student.cpp 自定义槽函数
void Student::treat()
{
       qDebug() << "Student treat teacher";
}

在窗口连接信号槽

// widget.h
zt = new Teacher(this);
st = new Student(this);
// 连接
connect(zt, &Teacher::hungry, st, &Student::treat);
// 触发下课函数
ClassIsOver();

但是如果有两个重名的信号和自定义的信号的槽,直接连接会报错,所以需要利用函数指针来指向函数地址再连接

// 函数指针
void (Teacher:: * teacherSingal)(QString) = &Teacher:: hangry;
void (Student:: * studentSlot)(QString) = &Student::treat;
// 连接
connect(teacher,teacherSingal,student,studentSlot);

QString 转 char*

// QString 转 char* 
// 先转QByteArray 再转到char*
foodName.toUTF8().data();

信号和槽的拓展

  • 一个信号可以和多个槽相连

  • 多个信号可以连接到一个槽

  • 一个信号可以连接到另外的一个信号

    新建一个btn,实现点击发送下课信号到Teacher类,再将老师饿了信号发送到Student类。

    connect(btn,&QPushButton::clicked,teacher,&Teacher::hungry);

  • 信号和槽可以断开连接

​ disconnect (sender, signal, receiver, slot);

​ 这种情况并不经常出现,因为当一个对象****delete之后,Qt自动取消所有连接到这个对象上面的槽

  • 信号和槽函数参数类型和个数必须同时满足两个条件
    • 信号函数的参数个数必须大于等于槽函数的参数个数
    • 信号函数的参数类型和槽函数的参数类型必须一一对应

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/400056.html

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

相关文章

Zabbix6.2利用模板和自定义监控项监控华为AR3260路由器

1&#xff1a;登录路由器的WEB管理控制台。在系统管理中找到SNMP然后开启SNMP代理&#xff0c;SNMP的版本可以只选择v2c都选择也无所谓&#xff0c;然后点击新建一个团体。 2&#xff1a;团体名称输入默认的public即可&#xff0c;在WEB端显示的是乱码&#xff0c;但是不影响使…

SQL执行过程详解

1 、用户在客户端执行 SQL 语句时&#xff0c;客户端把这条 SQL 语句发送给服务端&#xff0c;服务端的进程&#xff0c;会处理这条客户端的SQL语句。 2 、服务端进程收集到SQL信息后&#xff0c;会在进程全局区PGA 中分配所需内存&#xff0c;存储相关的登录信息等。 3 、客…

国外SEO策略指南:确保你的网站排名第一!

如果你想在谷歌等搜索引擎中获得更高的排名并吸引更多的流量和潜在客户&#xff0c;那么你需要了解一些国外SEO策略。 下面是一些可以帮助你提高谷歌排名的关键策略。 网站结构和内容优化 谷歌的搜索算法会考虑网站的结构和内容。 因此&#xff0c;你需要优化网站结构&…

2379. 得到 K 个黑块的最少涂色次数

2379. 得到 K 个黑块的最少涂色次数 难度简单 给你一个长度为 n 下标从 0 开始的字符串 blocks &#xff0c;blocks[i] 要么是 W 要么是 B &#xff0c;表示第 i 块的颜色。字符 W 和 B 分别表示白色和黑色。 给你一个整数 k &#xff0c;表示想要 连续 黑色块的数目。 每一…

Python数据结构与算法篇(二)-- 数组常见题型与解题技巧

数组和链表代表着计算机最基本的两种存储形式&#xff1a;顺序存储和链式存储&#xff0c;所以他俩可以算是最基本的数据结构。数组是一种基础数据结构&#xff0c;可以用来处理常见的排序和二分搜索问题&#xff0c;典型的处理技巧包括对双指针、滑动窗口等&#xff0c;数组是…

想要将多个视频拼接在一起?如何把三个视频合成一个视频

从事短视频创作行业以来&#xff0c;总是存在着各种挑战。最开始&#xff0c;因为主要负责视频素材的搜集&#xff0c;所以每天虽忙但充实&#xff0c;最近逐步开始学习视频的剪辑工作&#xff0c;可把我难到了&#xff01;想要将多个视频拼接在一起&#xff1f;如何把三个视频…

「 Java 8 新特性 」Stream 中的 map、peek、foreach 方法的区别

「 Java 8 新特性 」Stream 中的 map、peek、foreach 方法的区别 文章参考&#xff1a; 面试官问&#xff1a;Stream 中的 map、peek、foreach 方法的区别&#xff1f;傻傻分不清楚。。 stream中的map,peek,foreach的区别 一、概述 在学习java 8的stream api时&#xff0c;我们…

Java【数据结构入门OJ题33道】——力扣刷题记录1

文章目录第一天存在重复元素最大子数组和第二天两数之和合并两个有序数组第三天两个数组的交集买卖股票最佳时机第四天重塑矩阵杨辉三角第五天有效的数独矩阵置零第六天字符串中第一个唯一字符救赎金第七天判断链表是否有环合并两个有序链表移除链表元素第八天反转链表删除重复…

c++面试技巧-高级应用篇

1.面试官&#xff1a;什么是文件流&#xff1f; 应聘者&#xff1a;写入文件或者从文件读出的数据流称之为文件流。 2.面试官&#xff1a;文件流的类时如何划分的&#xff1f; 应聘者&#xff1a;当C对文件进行处理时&#xff0c;需要包括头文件iostream和fstream。fstream头…

游戏逆向之游戏技能分析

角色的当前技能列表往往都是从系统的技能库中进行筛选而组成的&#xff0c;而这个筛选的过程大多非常的复杂&#xff0c;经过的代码和临时结构体的传递也非常的多&#xff0c;所以在分析技能对象来源的时候常常要将OD和CE配合来使用。下面我们来分析下《天堂2》的技能列表。 首…

拼多多存在多种重大风险

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 中国电子商务市场发展迅速 拼多多&#xff08;PDD&#xff09;目前已经成为了在中国发展最快的电子商务平台之一。随着拼多多、阿里巴巴(BABA)和京东(JD)等市场主要参与者的竞争&#xff0c;中国电子商务正在迅速发展。 由…

安装SceneBuilder时出现Verify that you have access to that directory报错,解决方法之一

1、问题描述 安装SceneBuilder时出现Error writing to file...Verify that you have access to that directory报错&#xff0c;如图 2、解决步骤 1&#xff09;SceneBuilder-19.0.0.msi可从参考教程链接1获取&#xff0c;下载到文件夹D:\LcSceneBuilder\SceneBuilder-19.0.0…

Spring Cloud融合gateway自带GatewayFilter使用 | Spring Cloud 15

一、Spring Cloud Gateway内置GatewayFilter 路由过滤器允许以某种方式修改传入的 HTTP 请求或传出的 HTTP 响应。路由过滤器的范围是特定路由。Spring Cloud Gateway 包括许多内置的 GatewayFilter 工厂。 官网地址&#xff1a;https://docs.spring.io/spring-cloud-gateway…

MATLAB与图像处理的那点小事儿~

目录 一、学习内容 二、matlab基本知识 三、线性点运算 四、非线性点运算&#xff0c;伽马矫正 五、直方图 1、直方图均衡化 &#xff08;1&#xff09;使用histep函数实现图像均衡化 &#xff08;2&#xff09;使用自行编写的均衡化函数实现图像均衡化 2、直方图规定…

Ansys Zemax | 如何使用 OpticStudio 非序列优化向导

本文描述了如何使用 OpticStudio 非序列优化向导创建常见的评价函数类型&#xff0c;以及创建用于匹配导入图像文件的目标能量分布评价函数。&#xff08;联系我们获取文章附件&#xff09; 简介 在非序列模式下优化光学系统通常比在序列模式下的优化更复杂、更耗时。下期我们…

TencentOS tiny 移植到STM32F103教程

一、移植前的准备工作1. STM32的裸机工程模板这个可以自己创建&#xff08;创建过程参考之前的STM32裸机工程也有工程网盘在上面&#xff09;2.下载TencentOS tiny 源码TencentOS tiny的源码可从TencentOS tiny GitHub仓库地址https://github.com/Tencent/TencentOS-tiny下载&a…

无人机动力测试台:150kg级-Flight Stand 150

“飞行汽车”被人们广泛视为下一代交通工具。从2022年初至今&#xff0c;eVTOL&#xff08;电动垂直起降飞行器&#xff09;产业乃至整个UAM&#xff08;城市间空中交通&#xff09;市场呈现爆发式增长——各国航空制造企业纷纷入局&#xff0c;不断有新产品问世、试飞或试运行…

吐血整理,web自动化测试,POM模式搭建自动化测试框架(超级详细)

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 POM设计模式 主要是…

IO多路复用(select、poll、epoll网络编程)

目录一、高级IO相关1.1 同步通信和异步通信1.2 阻塞与非阻塞1.3 fcntl 函数二、五种IO模型2.1 阻塞式IO模型2.2 非阻塞式IO模型2.3 多路复用IO模型2.4 信号驱动式IO模型2.5 异步IO模型三、认识IO多路复用四、select4.1 认识select函数4.2 select函数原型4.3 select网络编程4.4 …

脂肪毒性的新兴调节剂——肠道微生物组

谷禾健康 肠道微生物组与脂质代谢&#xff1a;超越关联 脂质在细胞信号转导中起着至关重要的作用&#xff0c;有助于细胞膜的结构完整性&#xff0c;并调节能量代谢。 肠道微生物组通过从头生物合成和对宿主和膳食底物的修饰产生了大量的小分子。 最近的研究表明&#xff0c;由…