【Qt】学习Day1

文章目录

  • Qt简介
  • 创建第一个Qt程序
  • 创建过程
  • 介绍
    • main函数
    • 工程文件
    • 头文件
    • 控件源文件
    • 快捷键
    • 按钮控件常用API
    • 对象树
    • 坐标系
  • 信号和槽
    • 自定义信号
    • 自定义槽函数
    • 触发自定义的信号
    • 案例-下课后,老师触发饿了信号,学生响应信号,请客吃饭
    • 重载
    • 信号连接信号
    • Lambda表达式
    • 函数对象参数
    • 操作符重载函数参数
    • 可修改标志符mutable
    • 函数返回值
    • 函数体
    • lamdba表达式的应用
  • 作业

Qt简介

是一种跨平台图形界面引擎
1991年由奇趣科技创建
优点

  • 跨平台
  • 接口简单,容易上手
  • 一定程度上简化了内存回收

成功案例:
Linux桌面环境 KDE、谷歌地图、VLC多媒体播放器…

创建第一个Qt程序

创建过程

名称 - 不能有中文 不能有空格
路径 - 不能有中文路径
在这里插入图片描述

在这里插入图片描述
QWidget是一个父类
QMainWindow是子类,多了菜单栏、工具、状态栏
QDialog是子类,多了对话框
在这里插入图片描述
如图创建成功。
在这里插入图片描述

介绍

main函数

#include "mywidget.h"
#include <QApplication>// 包含一个应用程序类的头文件//main程序入口  argc命令行变量的数量  argv命令行变量的数组
int main(int argc, char *argv[])
{//a应用程序对象,在Qt中,应用程序对象 有且仅有一个QApplication a(argc, argv);//窗口对象  myWidget父类  -> QWidgetmyWidget w;//窗口对象 默认不会显示,必须要调用show方法显示窗口w.show();//让应用程序对象进入消息循环//当代码阻塞到这行return a.exec();//    while(true)
//    {
//         if(点击叉子)
//        {
//            break;
//        }
//    }}

QApplication a :应用程序对象,有且仅有一个
myWidget w;:实例化窗口对象
w.show():调用show函数 显示窗口
return a.exec() :让应用程序对象进入消息循环机制中,代码阻塞到当前行

工程文件

QT       += core gui		//Qt包含的模块greaterThan(QT_MAJOR_VERSION, 4): QT += widgets    //大于4版本以上 包含 widget模块CONFIG += c++17TARGET = study01  //目标 生成.exe程序的名称
TENPLATE = app    //模块 应用程序模块 ApplicationSOURCES += \		//源文件main.cpp \mywidget.cppHEADERS += \		//头文件mywidget.h

头文件

#ifndef MYWIDGET_H
#define MYWIDGET_H#include <QWidget>  //包含头文件 QWidget窗口类class myWidget : public QWidget
{Q_OBJECT	//宏,允许类中使用信号的槽的机制public:myWidget(QWidget *parent = nullptr);  //构造函数~myWidget();  //析构函数
};
#endif // MYWIDGET_H

#ifndef,#endif:防止头文件重包含

控件源文件

命名规范
类名 首字母大写,单词和单词之间首字母大写
函数名 变量名称 首字母小写,单词和单词之间首字母大写

1.查看控件的头文件、模块是否引用
模块引用加在设备文件中,如加network模块,则QT += core gui network
在这里插入图片描述

Header:头文件
qmake:模块
Inherite:父类
Inherited By:子类

模块引用加在设备文件中,如加network模块,则QT += core gui network

#include "mywidget.h"
#include <QPushButton> //按钮控件的头文件
#include "mypushbutton.h"
#include <QDebug>myWidget::myWidget(QWidget *parent): QWidget(parent)
{//创建一个按钮QPushButton * btn = new QPushButton;//btn->show(); //show以顶层方式弹出窗口控件//让btn对象 依赖在 myWidget窗口中btn->setParent(this);//显示文本btn->setText("第一个按钮");//创建第二个按钮 按照控件的大小创建窗口QPushButton * btn2 = new QPushButton("第二个按钮",this);//移动btn2按钮btn2->move(100,100);//按钮可不可以 重新制定大小 可以!btn2->resize(50,50);//重置窗口大小resize(600,400);//设置固定窗口大小setFixedSize(600,400);//设置窗口标题setWindowTitle("第一个窗口");//创建一个自己的按钮对象MyPushButton * myBtn = new MyPushButton;myBtn->setText("我自己的按钮");myBtn->move(200,0);myBtn->setParent(this); //设置到对象树中//需求  点击我的按钮 关闭窗口//参数1  信号的发送者 参数2  发送的信号(函数的地址) 参数3  信号的接受者 参数4  处理的槽函数//connect( myBtn, &MyPushButton::clicked, this, &myWidget::close  );connect( myBtn, &QPushButton::clicked, this, &QWidget::close  );
}myWidget::~myWidget()
{qDebug() << "myWidget的析构调用";
}

快捷键

快捷键
注释ctrl + /
运行ctrl + r
编译ctrl + b
字体缩放ctrl + 滚轮
查找ctrl + f
整行移动ctrl + shift + ↑/↓
帮助文档F1
自动对齐ctrl + i
同名之间的.h和.cpp切换F1

按钮控件常用API

API
创建QPushButton * btn = new QPushButton
设置父亲setParent(this)
设置文本setText(“文字”)
设置位置
重新指定窗口大小resize
设置窗口标题setWindowTitle
设置窗口固定大小setFixedSize
自动对齐ctrl + i
同名之间的.h和.cpp切换F1

对象树

当创建的对象在堆区时候,如果指定的父亲是QObject派生下来的类或者QObject子类派生下来的类,可以不用管理释放的操作,将对象会放入到对象树中。

坐标系

以左上角为原点(0,0),X向右增加,Y向下增加。
在这里插入图片描述
对于嵌套窗口,其坐标是相对于父窗口来说的。

信号和槽

connect(信号的发送者,发送的具体信号,信号的接收者,信号的处理(槽) )

connect(from,what,to,do)

信号槽的优点:松散耦合
信号的发送槽和接受槽本身是没有关联的,通过connect连接将两端耦合在一起。

案例:实现点击按钮关闭窗口
connect(btn,&QPushButton::click,this,&QWidget::close)

自定义信号

1.写到 signals下
2.返回 void
3.需要声明,不需要实现
4.可以有参数 ,可以重载

自定义槽函数

1.返回void
2.需要声明 ,也需要实现
3.可以有参数 ,可以重载
4.写到 public slot下 或者public 或者全局函数

触发自定义的信号

emit 自定义信号

案例-下课后,老师触发饿了信号,学生响应信号,请客吃饭

1.定义两个类Teacher和Student
在这里插入图片描述

2.在分别在.h文件写入信号量和槽
在这里插入图片描述

在这里插入图片描述

3.槽函数在.cpp文件去实现
在这里插入图片描述
4.回到窗口,在.h文件实例类并定义classIsOver函数,在cpp文件写流程顺序并实现classIsOver函数实现。
在这里插入图片描述
在这里插入图片描述

重载

1.在信号量和槽添加有参函数
在这里插入图片描述
在这里插入图片描述

2.更改emit和connect,需要用到函数指针明确指出函数地址void (* Teacher:: *tSignal)(QString) = &Teacher::hungry;

在这里插入图片描述
3.为了使得去掉双引号,需要将QString 转为char *
在这里插入图片描述

4.结果如图
在这里插入图片描述

信号连接信号

、

在这里插入图片描述

1.信号是可以连接信号的
2.一个信号可以连接多个槽函数
3.多个信号 可以连接 同一个槽函数
4.信号和槽函数的参数 必须类型一一对应
5.信号的参数个数 可以多余槽函数的个数

Lambda表达式

[函数对象参数](操作符重载函数参数)mutable ->返回值{函数体}

lambda表达式 最常用 [=](){}

函数对象参数

  • [ ]:没有使用任何函数对象参数
  • [=]:函数体可以使用可见的局部变量,且是值传递
  • [&]:函数体可以使用可见的局部变量,且是值传递

操作符重载函数参数

参数可以通过按值(如:(a,b))和按引用(如:(&a,&b))两种方式进行传递

可修改标志符mutable

按值传递函数对象参数时,加上mutable修饰符后,可以修改按值传递进来的拷贝(注意是能修改拷贝,而不是值本身)。

QPushButton * myBtn = new QPushButton (this);
QPushButton * myBtn2 = new QPushButton (this);
myBtn2->move(100,100);
int m = 10;connect(myBtn,&QPushButton::clicked,this,[m] ()mutable { m = 100 + 10; qDebug() << m; });
connect(myBtn2,&QPushButton::clicked,this,[=] ()  { qDebug() << m; });
qDebug() << m;

函数返回值

->函数返回值,要什么样的返回类型就加上什么类型。

int ret = []()->int{return 1000;}();
qDebug() << "ret="<<ret;

函数体

{ },标识函数的实现,这部分不能省略,但函数体可以为空。

lamdba表达式的应用

案例:点击按钮,关闭关口,输出“请老师吃饭,老师要吃宫保鸡丁”

    QPushButton * btn2 = new QPushButton ;btn2->setText("关闭");btn2->move(100,0);btn2->setParent(this);connect(btn2,&QPushButton::clicked, [=](){this->close();emit zt->hungry("宫保鸡丁");});

作业

1.设计两个按钮"open" “close”,当按下open时,打开一个新窗口;当按下close时,关闭新窗口

#include "mainwindow.h"
#include <QPushButton>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{QWidget *one=new QWidget;QPushButton * btn1 = new QPushButton("open",this);btn1->move(200,100);btn1->resize(100,50);QPushButton * btn2 = new QPushButton("close",this);btn2->move(200,250);btn2->resize(100,50);setFixedSize(600,400);connect(btn1,&QPushButton::clicked,this,[=](){one->show();});connect(btn2,&QPushButton::clicked,this,[=](){one->close();});}MainWindow::~MainWindow() {}

2.设计一个按钮"open" ,当按下open时,按钮变为"close"并打开一个新窗口;当按下close时,按钮变为’"open"并关闭新窗口。

#include "mainwindow.h"
#include <QPushButton>MainWindow::MainWindow(QWidget *parent): QMainWindow(parent)
{QWidget *one=new QWidget;one->setWindowTitle("新窗口");QPushButton * btn = new QPushButton;btn->setParent(this);btn->setText("open");btn->resize(100,50);connect(btn,&QPushButton::clicked,one,[=](){if(btn->text()=="close"){one->close();btn->setText("open");}else{one->show();btn->setText("close");}});}MainWindow::~MainWindow() {}

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【目标检测】Yolov8 完整教程 | 检测 | 计算机视觉

学习资源&#xff1a;https://www.youtube.com/watch?vZ-65nqxUdl4 努力的小巴掌 记录计算机视觉学习道路上的所思所得。 1、准备图片images 收集数据网站&#xff1a;OPEN IMAGES 2、准备标签labels 网站&#xff1a;CVAT 有点是&#xff1a;支持直接导出yolo格式的标…

PHP师生荣誉管理系统-计算机毕业设计源码10079

目 录 摘要 1 绪论 1.1 研究背景 1.2论文结构与章节安排 2 师生荣誉管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据增加流程 2.2.2 数据修改流程 2.2.3 数据删除流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.…

AI新热点:边云协同:大模型结合小模型(大小模型联合推理)

背景 AI模型规模不断剧增已是不争的事实。模型参数增长至百亿、千亿、万亿甚至十万亿&#xff0c;大模型在算力推动下演变为人工智能领域一场新的“军备竞赛”。 这种竞赛很大程度推动了人工智能的发展&#xff0c;但随之而来的能耗和端侧部署问题限制了大模型应用落地。2022…

离线安装docker-v26.1.4,compose-v2.27.0

目录 ​编辑 1.我给大家准备好了提取即可 2.安装docker和compose 3.解压 4.切换目录 5.执行脚本 6.卸载docker和compose 7.执行命令 “如果您在解决类似问题时也遇到了困难&#xff0c;希望我的经验分享对您有所帮助。如果您有任何疑问或者想分享您的经历&#xff0c;…

windows10/win11截图快捷键 和 剪贴板历史记录 快捷键

后知后觉的我今天又学了两招&#xff1a; windows10/win11截图快捷键 按 Windows 徽标键‌ Shift S。 选择屏幕截图的区域时&#xff0c;桌面将变暗。 默认情况下&#xff0c;选择“矩形模式”。 可以通过在工具栏中选择以下选项之一来更改截图的形状&#xff1a;“矩形模式”…

计算机组成原理笔记-第1章 计算机系统概论

第一章 计算机系统概论 笔记PDF版本已上传至Github个人仓库&#xff1a;CourseNotes&#xff0c;欢迎fork和star&#xff0c;拥抱开源&#xff0c;一起完善。 该笔记是最初是没打算发网上的&#xff0c;所以很多地方都为了自我阅读方便&#xff0c;我理解了的地方就少有解释&a…

【UE5.3】笔记4-自定义材质蓝图

正常来说&#xff0c;我们都是拿到什么材质用什么材质&#xff0c;那么我们如何去创建自定义的材质呢&#xff1f; 首先&#xff0c;创建MyMaterials文件夹用来存放我们自制的材质&#xff1b; 然后&#xff0c;右键创建一个材质&#xff0c;起个名字&#xff0c;双击打开&am…

springcould-config git源情况下报错app仓库找不到

在使用spring config server服务的时候发现在启动之后的一段时间内控制台会抛出异常&#xff0c;spring admin监控爆红&#xff0c;控制台信息如下 --2024-06-26 20:38:59.615 - WARN 2944 --- [oundedElastic-7] o.s.c.c.s.e.JGitEnvironmentRepository : Error occured …

onlyoffice官方文档中打开文件示例的相关测试

文档地址&#xff1a;https://api.onlyoffice.com/zh/editors/open 开发环境&#xff1a; 后端&#xff1a;zdppy_api开发的一个文档服务前端&#xff1a;vue3开发的客户端 我们在index.html中&#xff0c;引入了文档服务的js文件&#xff1a; <!doctype html> <h…

【新闻】全球热钱,正在流入新加坡 这个夏天有点猛,油价看涨? 普华永道已丢了六成“A股大客户”

新加坡成为全球投资焦点&#xff0c;吸引大量并购活动。预计经济增长2.4%&#xff0c;股指上涨8%。未来可期待更多国际投资涌入。 近期&#xff0c;新加坡成为全球投资者的焦点&#xff0c;吸引了大量的并购和投资活动。 据报道&#xff0c;2024年第二季度&#xff0c;新加坡…

C++ Vector的模拟实现

vector的介绍 1. vector是表示可变大小数组的序列容器。 2. 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&#xff0c;而…

使用c++栈刷题时踩坑的小白错误

根据图片中提供的代码&#xff0c;可以发现以下三处错误&#xff1a; 错误原因&#xff1a;条件判断语句的逻辑错误。 代码行&#xff1a;if (res.top() ! e || res.empty())&#xff08;第7行&#xff09; 问题&#xff1a;如果 res 为空&#xff08;res.empty() 为 true&…

java的字节符输出流基类、File Writer类和Buffered Writer类

一、字节符输出流基类&#xff1a;Writer 1.属于抽象类 2.常用方法 二、字节符输出流Flie Writer类 1.是writer类的子类 2.以字符为数据处理单元向文本文件中写数据 3.示例 4.实现步骤 三、BufferedWriter类 1.是Writer类的子类。 2.带有缓冲区 默认情况下&#xff0c…

线性代数基础概念:矩阵

目录 线性代数基础概念&#xff1a;矩阵 1. 矩阵的定义 2. 矩阵的运算 3. 矩阵的特殊类型 4. 矩阵的秩 5. 矩阵的初等变换 6. 矩阵的特征值与特征向量 7. 矩阵的应用 8. 矩阵总结 总结 线性代数基础概念&#xff1a;矩阵 矩阵是线性代数中的另一个重要概念&#xff0…

【原创】springboot+mysql海鲜商城设计与实现

个人主页&#xff1a;程序猿小小杨 个人简介&#xff1a;从事开发多年&#xff0c;Java、Php、Python、前端开发均有涉猎 博客内容&#xff1a;Java项目实战、项目演示、技术分享 文末有作者名片&#xff0c;希望和大家一起共同进步&#xff0c;你只管努力&#xff0c;剩下的交…

Google Adsense----Wordpress插入谷歌广告

1.搭建个人博客,绑定谷歌search consol,注册adsense 详细可以参考这个视频b站视频 2.将个人博客网站关联到Adsense 在adsense里新加网站,输入你的博客网址,双击网站 将这段代码复制到header.php的里面 在wordpress仪表盘的外观-主题文件编辑器,找到header.php将代码复制,…

Scania斯堪尼亚SHL题库综合能力性格测试真题题型解析及面试经验

一、走进Scania斯堪尼亚 Scania是一家成立于1891年的瑞典公司&#xff0c;专注于重型卡车和巴士的制造&#xff0c;以其模块化系统和环保设计闻名。作为全球领先的运输解决方案提供商&#xff0c;Scania不仅提供高质量的车辆&#xff0c;还提供相关服务和融资解决方案。公司秉…

【Unity服务器01】之【AssetBundle上传加载u3d模型】

首先打开一个项目导入一个简单的场景 导入怪物资源&#xff0c; AssetBundle知识点&#xff1a; 1.指定资源的AssetBundle属性标签 &#xff08;1&#xff09;找到AssetBundle属性标签 &#xff08;2&#xff09;A标签 代表&#xff1a;资源目录&#xff08;决定打包之后在哪…

Java基础(二)——数组,方法,方法重载

个人简介 &#x1f440;个人主页&#xff1a; 前端杂货铺 ⚡开源项目&#xff1a; rich-vue3 &#xff08;基于 Vue3 TS Pinia Element Plus Spring全家桶 MySQL&#xff09; &#x1f64b;‍♂️学习方向&#xff1a; 主攻前端方向&#xff0c;正逐渐往全干发展 &#x1…