【Qt笔记①】帮助文档、窗口、按钮、信号和槽、lambda表达式

news2025/4/20 3:28:54

学习第一天:2024-3-9

文章目录

  • Qt creator 快捷键
  • 帮助文档
  • 默认生成的main.cpp逐行解释
  • 核心类
  • 帮助文档的查阅方法-①
  • 代码创建按钮
      • 第一个
      • 第二个
      • 对窗口的其他设置
  • 对象树
  • 窗口坐标系
  • 信号和槽(优点:松散耦合)
      • 帮助文档的查阅方法-②
          • 找信号函数的方法
          • 找槽函数的方法
      • 自定义信号和槽
  • lambda表达式
  • 练习
  • Menu
  • Tool

Qt creator 快捷键

运行:ctrl+r
帮助文档:F1 退出文档:ESC
自动对齐:ctrl+i
在这里插入图片描述

帮助文档

在这里插入图片描述

默认生成的main.cpp逐行解释

核心类

QObject 万类之祖

帮助文档的查阅方法-①

打开assistant.exe,左侧点索引,输入QPushButton,看到右侧显示如下内容。Header是头文件,qmake是在.pro文件中应该加入的内容,Inherits是该类继承自谁(即父类),Inherited by是该类的子类。
在这里插入图片描述

代码创建按钮

第一个

新建一个QWidget项目,起名为btxl。在btxl.cpp中加入头文件<QPushButton>,btxl类构造函数中加入以下内容:

btxl::btxl(QWidget *parent)
    : QWidget(parent)
{
	QPushButton * bt = new QPushButon;
}

这样就创建了一个按钮,但是ctrl+r运行不显示这个按钮,why?
你想起了main.cpp中btxl类实例化的w是要通过show函数来显示的,并且QPushButton的父类的父类就是QWidget,于是做出如下修改:

btxl::btxl(QWidget *parent)
    : QWidget(parent)
{
	QPushButton * bt = new QPushButon;
	bt->show();
}

这下好了,运行后出现两个窗口。你想:不不不,按钮是要在页面上的。
正确写法:

btxl::btxl(QWidget *parent)
    : QWidget(parent)
{
	QPushButton * bt = new QPushButon;
	//bt->show();
	bt->setParent(this);
}

setParent相当于设置了一个层级关系(类似于unity的hierarchy)
你还想给这个按钮上写点文字:

btxl::btxl(QWidget *parent)
    : QWidget(parent)
{
	QPushButton * bt = new QPushButon;
	//bt->show();
	bt->setParent(this);
	bt->setText("hahaha");
}

在这里插入图片描述

第二个

![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/75677624e3d546658153da33ecd7922d.pn
这样窗口就很小。

对窗口的其他设置

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

对象树

只要new出来的对象设置了parent(方法为setParent),就能加到对象树中,关掉窗口后自动析构,无需手动free。这样一定程度上简化了内存回收机制。但请注意,仅仅从QObject派生是无法自动析构的,必须要setParent

【测试一】

myButton类派生自QPushButton,析构函数输出一句话“myButton析构”。在关掉按钮的小窗口时并没有析构。

    myButton *mbtn = new myButton();
    mbtn->show();

【测试二】

myButton类派生自QPushButton,析构函数输出一句话“myButton析构”。在关掉按钮的小窗口时显示析构。

    myButton *mbtn = new myButton();
    mbtn->setParent(this);

【测试三】

Student类和Score类派生自QObject(万类之祖)。对象s设置了parent,而对象xiaoming没有设置parent。关闭窗口时,显示s析构而xiaoming未析构。

    //创建对象
    xiaoming = new Student;
    s = new Score;
    s->setParent(this);

在这里插入图片描述
在这里插入图片描述

窗口坐标系

在这里插入图片描述
在这里插入图片描述

信号和槽(优点:松散耦合)

需求:点一个按钮,关闭窗口。翻译一下就是:按钮点击,导致窗口关闭。这句话加粗的四个部分就是connect的四个参数。具体的:

参数1:信号发送者
参数2:发送的信号(函数地址)
参数3:信号接收者
参数4:对信号进行的反应函数(称为槽函数(slots),也传函数地址)

信号函数和槽函数的查找就需要帮助文档了。

帮助文档的查阅方法-②

找信号函数的方法

信号的发送者是bt,类型是QPushButton。查找
在这里插入图片描述
在页面中找signal字样。
在这里插入图片描述
发现QPushButton的信号函数就是从祖先那继承来的。
点开第一个,是它的直接父类,QAbstractButton。clicked就是我们要找的。
在这里插入图片描述

找槽函数的方法

信号的接收者是本页面,类型是btxl,继承自QWidget。
在这里插入图片描述
右侧第五个Public Slots就是槽函数。
点开:
在这里插入图片描述
我们需要的是第一个,click()

综上,实现方法是下面这句话:

connect(bt, &QPushButton::clicked, this, &btxl::close);connect(bt, &QPushButton::clicked, this, &QWidget::close);

在这里插入图片描述

自定义信号和槽

注意:先连接,发送信号者再发出信号。
自定义的信号写在signals下,信号只需要声明,不需要实现
自定义的槽写在public slots下,槽需要声明也需要实现
在这里插入图片描述
触发信号的关键字:emit

lambda表达式

lambda表达式是c++的语法糖,所谓语法糖就是复杂语法的等价简化写法。定义匿名函数(无需函数名)。
最常见的用法是[=](){},例如:

btxl::btxl(QWidget *parent)
    : QWidget(parent)
{
    QPushButton * bt2 = new QPushButton("点我", this);
    connect(bt2, &QPushButton::clicked, this, [=](){ //第三个参数可省略,默认是this
        bt2->setText("已经点过啦");
    });
    
}

lambda表达式作为槽函数时,可以使一句connect连接多个槽函数。例如:

btxl::btxl(QWidget *parent)
    : QWidget(parent)
{
    //创建对象
    xiaoming = new Student;
    s = new Score;

    QPushButton * bt = new QPushButton("x", this);
    connect(bt, &QPushButton::clicked, this, [=](){
        this->close();
        emit xiaoming->goodStudy(); //emit可省
    });

    connect(xiaoming, &Student::goodStudy, s, &Score::highScore);

}

练习

窗口上有一个按钮,按一下打开一个新窗口,再按一下关闭新窗口。

#include "btxl.h"
#include <QPushButton>


btxl::btxl(QWidget *parent)
    : QWidget(parent)
{

    int stat = 0;
    QWidget *newpage = new QWidget;

    QPushButton * bt = new QPushButton("打开新窗口", this);
    bt->resize(100,50); //按钮的大小
    connect(bt, &QPushButton::clicked, this, [=, &stat](){
        if (stat == 1)
        {
            newpage->close();
            bt->setText("打开新窗口");
            stat = 0;
        }
        else
        {
            newpage->show();
            bt->setText("关闭新窗口");
            stat = 1;
        }
        qDebug() << stat;
    });
}


btxl::~btxl()
{

}

Menu

    ui->setupUi(this);
    resize(600, 400);
    QMenuBar *bar = menuBar();
    setMenuBar(bar);
    QMenu * fileMenu = bar->addMenu("文件");
    fileMenu->addAction("新建");
    fileMenu->addSeparator();
    fileMenu->addAction("打开");
    QMenu * editMenu = bar->addMenu("编辑");
    editMenu->addAction("查找");

Tool

在这里插入图片描述

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

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

相关文章

【数据挖掘】机器学习中相似性度量方法-闵可夫斯基距离

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

java周测总结(2)

1.什么是I0流. 是一串流动的字符从先进先出的方式发送信息的通道。 2.IO流共有多少种划分方式,分别都包含哪些流 三种 按流分 输出输入流 按处理单元分 字节和节符 按流的角色方 节点流和处理流 3.如何把字荐串交量str转换为字节数组,并且存入bytes数组当中 byt…

达梦8 通过SF_INJECT_HINT解决新排序机制下失控语句影响其他SQL执行的问题

达梦数据库有两种排序机制。当SORT_FLAG设置0时&#xff0c;采用旧排序机制&#xff1b;当SORT_FLAG1时&#xff0c;采用新排序机制。详见《达梦新老排序机制的对比》 两种排序机制各有优缺点。 新排序机制引入了全局排序区概念&#xff0c;虽然避免了内存溢出导致系统OOM&am…

【0-1系列】从0-1快速了解搜索引擎Scope以及如何快速安装使用(下)

前言 近日&#xff0c;社区版家族正式发布V2024.5版本&#xff0c;其中&#xff0c;社区开发版系列重磅发布Scope开发版以及StellarDB开发版。 为了可以让大家更进一步了解产品&#xff0c;本系列文章从背景概念开始介绍&#xff0c;深入浅出的为读者介绍Scope的优势以及能力…

OOM日志分析

目录 1. 日志分析2. MAT 工具2.1 日志打印方式2.1.1 HeapDumpOnOutOfMemoryError&#xff08;推荐&#xff09;2.1.2 jmp 命令 2.2 MAT分析方式2.2.1 饼图分析2.2.2 树形图分析2.2.2 泄漏疑点 3. 优化 首先说一下结论&#xff1a;通过MAT工具分析才是最精准的&#xff0c;直接通…

[数据概念]梅宏院士-数据要素化怎么办十问

“ 提出问题&#xff0c;才能解决问题。” 5月27日&#xff0c;2023中国国际大数据产业博览会“数据要素流通与价值化”论坛举行&#xff0c;中国科学院院士、中国计算机学会理事长梅宏发出数据要素化十问。 本文主要内容转自 数字化转型战略指南 01 第一问&#xff1a;能否以…

基于SpringBoot+Vue大学毕业设计管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…

【深度学习实战(40)】可变形卷积

一、可变形卷积&#xff08;DCN/DConv&#xff09; (a)是普通的卷积操作 (b)、©、(d)是可变形卷积&#xff08;deformable convolution&#xff0c;即DConv&#xff09; 可变形卷积实际是指标准卷积操作中采样位置增加了一个偏移量offset&#xff0c;这样卷积核就能在训…

Git 冲突处理指南:恢复 Git Reset

⭐️我叫忆_恒心&#xff0c;一名喜欢书写博客的研究生&#x1f468;‍&#x1f393;。 如果觉得本文能帮到您&#xff0c;麻烦点个赞&#x1f44d;呗&#xff01; 近期会不断在专栏里进行更新讲解博客~~~ 有什么问题的小伙伴 欢迎留言提问欧&#xff0c;喜欢的小伙伴给个三连支…

市场情绪周期2024-6-12(无用之用篇)

佛学老指引人们去向内求&#xff0c;“灵山就在汝心头&#xff0c;人人有个灵山塔&#xff0c;好在灵山塔下修”&#xff0c;你跟佛有没有缘&#xff0c;在于你是某个阶段不用别人引导自己发现那些东西已经在等你很久了&#xff0c;为何向内求&#xff1f;因为内心才是人之主体…

react使用OpenLayers实现类似船某网在地图放大时展示具体船舶符号缩小时显示聚合小点效果

一、效果 如图所示&#xff0c;地图缩小&#xff08;即比例尺放大&#xff09;时&#xff0c;显示聚合小绿点&#xff1b; 地图放大&#xff08;比例尺缩小&#xff09;时&#xff0c;展示具体船舶符号&#xff1a; 二、思路 1&#xff09;设置2个图层&#xff0c;一个展示…

【区块链】区块链架构设计:从原理到实践

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 区块链架构设计&#xff1a;从原理到实践引言一、区块链基础概念1.1 区块链定义…

解决:net8使用swagger的时候,调用接口401,Error: Unauthorized,无法通过验证,其实是因为没有Authorization头

目录 1. 背景2. 解决方案 1. 背景 上一篇文章讲了用net8JWTSwagger&#xff0c;尝试做一个demo&#xff0c;然后掉坑里&#xff0c;jwt能生成token&#xff0c;但是解析不正确&#xff0c;地址&#xff0c;这个demo还遇到一个奇怪的问题&#xff0c;一个demo遇到2个奇怪的问题…

Leetcode84 柱状图中最大的矩形

题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积 解题思路 思路一&#xff1a;暴力寻找&#xff0c;从每个位置出发&#xff0c;向左右两边扩…

上证所抓包实战

第 2 页jsonCallBack 回调函数Request Headers爬取股票列表下载时间戳Initiator在 Network 中抓到的包,有 Headers、Payload、Preview、Response、Initiator、Timing、Cookies 面板,从这些面板中获取有用的信息来写脚本。 上海证券交易所 https://www.sse.com.cn/assortment…

数据分析必备:一步步教你如何用matplotlib做数据可视化(10)

1、Matplotlib 二维箭头图 箭头图将速度矢量显示为箭头&#xff0c;其中分量(u&#xff0c;v)位于点(x&#xff0c;y)。 quiver(x,y,u,v)上述命令将矢量绘制为在x和y中每个对应元素对中指定的坐标处的箭头。 参数 下表列出了quiver()函数的参数 - x - 1D或2D阵列&#xff0c;…

示例:推荐一个基于第三方QRCoder.Xaml封装的二维码显示控件

一、目的&#xff1a;基于第三方QRCoder.Xaml封装的二维码控件&#xff0c;为了方便WPF调用 二、效果如下 功能包括&#xff1a;背景色&#xff0c;前景色&#xff0c;中心图片设置和修改大小&#xff0c;二维码设置等 三、环境 VS2022 四、使用方式 1、安装nuget包&#xf…

国产自研编程语言“仓颉”来了!

在 6.21 召开的华为开发者大会&#xff08;HDC2024&#xff09;上,华为自研的国产编程语言“仓颉”终于对外正式发布了&#xff01; 随着万物互联以及智能时代的到来&#xff0c;软件的形态将发生巨大的变化。一方面&#xff0c;移动应用和移动互联网领域仍然强力驱动人机交互…

抖音多功能全自动引流工具,支持评论关注私信留痕点赞等,让你的抖音粉丝暴涨!

随着短视频行业的火爆&#xff0c;越来越多的人开始关注抖音这个平台。然而&#xff0c;如何在抖音上获得更多的关注和粉丝&#xff0c;成为了许多人面临的难题。为了帮助大家解决这个问题&#xff0c;今天我们将为大家推荐一款抖音多功能全自动引流脚本&#xff0c;这款脚本可…

【Python】已解决:ModuleNotFoundError: No module named ‘paddle’

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决&#xff1a;ModuleNotFoundError: No module named ‘paddle’ 一、分析问题背景 在Python编程中&#xff0c;ModuleNotFoundError是一个常见的错误&#xff0c;它通常发生…