QT学习日记一

news2024/10/1 20:16:40
  1. 创建QT文件步骤在这里插入图片描述
    在这里插入图片描述

这是创建之后widget.cpp和widget.h文件的具体代码解释,也是主要操作的文件,其中main.cpp不用操作,ui则是图形化操作界面,综合使用时,添加一个元件要注意重编名和编译一下,才能在widget这类文件中提示出来

//widget.h
#ifndef WIDGET_H            // 如果没有定义WIDGET_H宏,则定义它。这个宏防止头文件被多次包含。
#define WIDGET_H            // 定义WIDGET_H宏。

#include <QWidget>          // 包含Qt库中的QWidget类的头文件。QWidget是所有UI对象的基类。

QT_BEGIN_NAMESPACE          // 开始Qt命名空间的定义。
namespace Ui { class Widget; } // 前向声明Ui命名空间中的Widget类。这个类是由Qt Designer生成的,用于管理UI。
QT_END_NAMESPACE            // 结束Qt命名空间的定义。

class Widget : public QWidget  // 定义Widget类,继承自QWidget类。
{
    Q_OBJECT               // 这是一个Qt宏,启用Qt的信号和槽机制。

public:
    Widget(QWidget *parent = nullptr); // 构造函数,接受一个父窗口指针,默认值为nullptr(空指针)。
    ~Widget();                         // 析构函数,销毁Widget对象。
//可以在这里声明信号槽函数,不过要添加关键字public slot:,类同public

private:
    Ui::Widget *ui;        // 指向Ui::Widget对象的指针,用于管理用户界面。
};

#endif // WIDGET_H         // 结束WIDGET_H宏的条件编译。

//widget.cpp
#include "widget.h"          // 包含当前类的头文件,这个文件中定义了Widget类的声明和成员函数原型。
#include "ui_widget.h"       // 包含由Qt用户界面设计工具(Qt Designer)生成的头文件,这个文件中定义了Ui::Widget类,负责UI元素的布局和定义。

Widget::Widget(QWidget *parent)
    : QWidget(parent)       // 调用父类QWidget的构造函数,并将父窗口指针parent传递给它。父窗口指针用于指定当前窗口的父窗口。
    , ui(new Ui::Widget)    // 分配内存,创建一个新的Ui::Widget对象,并将其指针赋值给成员变量ui。Ui::Widget类由Qt Designer生成,用于管理窗口小部件的布局和控件。
{
    ui->setupUi(this);      // 调用Ui::Widget类的setupUi方法,初始化用户界面。这会将设计器中定义的UI元素(如按钮、标签等)设置到当前Widget对象中。
    //ui上的操作元件大多也在这里使用,比如connect
}

Widget::~Widget()
{
    delete ui;              // 在析构函数中删除ui指针指向的Ui::Widget对象,释放其占用的内存,防止内存泄漏。
}
//在此处定义widget类中的函数

一、log输出

  1. 在Qt中进行log输出, 一般不使用c中的printf, 也不是使用C++中的cout, Qt框架提供了专门用于日志输出的类, 头文件名为 QDebug
  2. qDebug(), qWarning(), qInfo(), 和 qCritical()是用于日志记录调试输出的函数。它们分别用于不同级别的日志记录,帮助开发者在不同场景下记录和调试信息。
  • qDebug():用于开发阶段的调试信息,不重要的详细信息。
  • qWarning():用于警告信息,表示有潜在问题,但不一定是致命的。
  • qInfo():用于一般信息,常规运行时的状态信息。
  • qCritical():用于严重错误信息,表示重大问题或异常。
    在这里插入图片描述
  • 默认情况下日志信息是不会打印到终端窗口的, 如果想要实现这样的效果, 必须在项目文件中添加相关的属性信息----->打开项目文件(*.pro)找到配置项 config, 添加 console 控制台属性----->CONFIG += c++11 console

二、帮助

  • 将光标放在函数上,按 F2+FN 会跳转到 函数的定义。
  • 将光标放在函数上,按 Shift + F2+FN 会跳转到函数的声明(如果在头文件中声明)。
  • 将光标放在函数上,按 Ctrl + Shift + U 会查找函数在项目中的所有使用情况。
  • 将光标放在函数上,按 F1 +FN会打开Qt帮助窗口,显示 函数 的详细文档。

三、QT中的信号槽

  1. 在Qt中,信号和槽机制是一种用于对象之间通信的方式,特别适用于事件驱动的编程。信号和槽机制允许一个对象发送信号并且其他对象响应这些信号,即使它们对彼此一无所知。这种机制比传统的回调函数更灵活、更容易使用。
  2. 信号和槽机制的内部工作原理
  • 元对象系统(MOC)
    当您定义一个包含信号和槽的类时,Qt的元对象系统(MOC)会生成一些额外的代码。这些代码负责实现信号和槽的机制。MOC会为每个信号生成一个唯一的整数ID,并创建一个包含信号和槽信息的表。
  • 连接信号和槽
    当您调用connect函数时,Qt会将信号和槽的连接信息存储在QObject的内部数据结构中。每个QObject对象都有一个指向QMetaObject的指针,QMetaObject包含了该对象的所有元数据信息,包括信号和槽的连接信息。
  • 发射信号
    信号被发射时,Qt会查找与该信号连接的所有槽,并依次调用它们。对于同一线程中的连接,槽函数会立即被调用。对于跨线程的连接,信号会被放入接收者所在线程的事件队列中,等待事件循环调度执行。
  • 事件队列
    Qt使用事件队列和事件循环来管理跨线程的信号和槽连接。当跨线程信号被发射时,信号会被封装成一个事件,并放入接收者线程的事件队列中。接收者线程的事件循环会处理这些事件,并调用相应的槽函数。
  1. 连接信号和槽的函数connect()函数
函数原型(老旧的)
  QObject::connect(sender, SIGNAL(signal()), receiver, SLOT(slot()));

- sender:发出信号的对象的指针
- SIGNAL(signal()):发送者的信号。signal()是发送者类中的信号名称。()内的参数可以再一次细分信号类型。
- receiver:接收者对象指针。表示在当前的类里面
- SLOT(slot()):接收者的槽函数,使用SLOT宏来指定接收者类中的槽函数。slot()是接收者类中的槽函数名称。()内的参数可以再一次细分信号类型。
-------------------------------------------------------------------------------------------
connect函数相对于做了信号处理动作的注册
调用conenct函数的sender对象的信号并没有产生, 因此receiver对象的method也不会被调用
connect中的sender和recever两个指针必须被实例化了, 否则conenct不会成功

在这里插入图片描述

  • 在Qt中,槽函数是用于响应信号的函数。槽函数可以是任何符合签名要求的成员函数、全局函数或静态函数。它们在某些事件(由信号发射)发生时被调用。例如btnLogClickedSlotFun()就是自定义的槽函数。
  • 信号函数:clicked()、pressed()、released(),分别是点击,按下持续,释放
  1. 自定义信号和自定义槽函数
自定义信号的要求和注意事项:

信号是类的成员函数
返回值必须是 void 类型
信号的名字可以根据实际情况进行指定
参数可以随意指定, 信号也支持重载
信号需要使用 signals 关键字进行声明, 使用方法类似于public等关键字
信号函数只需要声明, 不需要定义(没有函数体实现)
在程序中发射自定义信号: 发送信号的本质就是调用信号函数
习惯性在信号函数前加关键字: emit, 但是可以省略不写
emit只是显示的声明一下信号要被发射了, 没有特殊含义
底层 emit == #define emit


自定义槽函数的要求
槽函数必须是类的成员函数:
槽函数必须是继承自 QObject 的类的成员函数,不能是全局函数。

槽函数必须标记为 slots 或使用 Q_SLOT 关键字:
在类定义中,槽函数需要使用 slots 或 Q_SLOT 关键字标记。例如:

public slots:
    void mySlotFunction();
    
槽函数的参数类型和数量必须与信号匹配:
槽函数的参数类型和数量必须与连接的信号一致。例如,如果信号的签名是 void signal(int, QString),那么槽函数的签名也应该是 void slot(int, QString)。

槽函数的访问权限可以是 public、protected 或 private:
槽函数可以是 public、protected 或 private,这取决于类的设计和访问控制需求。
确保信号和槽的参数类型和顺序一致。如果不匹配,编译器不会报错,但运行时连接将失败,信号和槽之间不会通信。
槽函数的执行时间应尽量短,不要在槽函数中执行长时间阻塞的操作,因为这可能会阻塞事件循环,导致用户界面无响应。
如果不再需要信号和槽之间的连接,可以使用 disconnect 函数断开它们。可以断开特定的信号和槽,也可以断开对象之间所有的信号和槽。小窍门(在连接处加上dis即可)



在这里插入图片描述
5. 一个信号可以连接多个槽函数, 发送一个信号有多个处理动作,槽函数的执行顺序是随机的, 和connect函数的调用顺序没有关系,一个槽函数可以连接多个信号, 多个不同的信号, 处理动作是相同的

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

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

相关文章

tomcat 项目迁移,无法将项目作为服务service启动

背景 测试服务器需要迁移到正式服务器上&#xff0c;为了方便省事&#xff0c;将测试服务器上的一些文件直接复制到正式服务器 问题 使用startup启动项目之后&#xff0c;可以直接使用使用tomcat9w启动&#xff0c;或者作为服务service启动的时候&#xff0c;显示无法访问到资源…

STM32 GPIO的工作原理

STM32的GPIO管脚有下面8种可能的配置:&#xff08;4输入 2 输出 2 复用输出) &#xff08;1&#xff09;浮空输入_IN_FLOATING 在上图上&#xff0c;阴影的部分处于不工作状态&#xff0c;尤其是下半部分的输出电路&#xff0c;实际上是与端口处于隔离状态。黄色的高亮部分显示…

程序中的log4j、stderr、stdout日志区别

使用 databricks 的过程中&#xff0c;发现他将日志分为 log4j、stderr、stdout日志。了解日志是调试程序关键技能。顺着这个思路&#xff0c;我认真学习了一下这几个日志的区别。 目录 Java 中的日志目录结构使用log4j记录日志向标准输出和标准错误输出写信息运行结果 以pytho…

前端八股文 闭包的理解

什么是闭包 闭包是指有权访问另一个函数作用域中的变量的函数 ——《JavaScript高级程序设计》 &#xff08;闭包 内层函数 引用的外层函数的变量&#xff09; 下面就是一个简单的闭包 闭包不一定必须有 return 闭包不一定有内存泄漏 闭包 什么时候用到 return 就是 外部…

Flutter-实现物理小球碰撞效果

效果 引言 在Flutter应用中实现物理动画效果,可以大大提升用户体验。本文将详细介绍如何在Flutter中创建一个模拟物理碰撞的动画小球界面,主要代码实现基于集成sensors_plus插件来获取设备的加速度传感器数据。 准备工作 在开始之前,请确保在pubspec.yaml文件中添加senso…

中职网络安全Server2216

任务环境说明&#xff1a;✓ 服务器场景&#xff1a;Server2216&#xff08;开放链接&#xff09;✓ 用户名:root密码&#xff1a;1234561.黑客通过网络攻入本地服务器,通过特殊手段在系统中建立了多个异常进程找出启动异常进程的脚本&#xff0c;并将其绝对路径作为Flag值提交…

2.17分一区文献精读:机器学习:乳腺癌预后预测的统计和机器学习模型的开发及内外部验证:队列研究-摘要

#精医求精&#xff0c;文献阅读 大家好&#xff0c;我是蔡老师&#xff0c;一个立志学会所有医学大数据分析模型的女子 今天我们从文献阅读开始 这篇文章的影响因子为17分&#xff0c;全文名称为《Development and internal-external validation of statistical and machine l…

Tensorflow之损失函数与交叉熵

损失函数&#xff1a;预测值与已知答案之间的差距 NN优化目标&#xff1a;loss最小{mse&#xff0c; 自定义&#xff0c; ce) 均方误差tensorflow实现&#xff0c;loss_mse tf.reduce_mean(tf.sqrue(y_-y) 预测酸奶日销量&#xff0c;y&#xff0c;x1, x2是影响日销量的因素…

什么是RPC?有哪些RPC框架?

定义 RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种允许运行在一台计算机上的程序调用另一台计算机上子程序的技术。这种技术屏蔽了底层的网络通信细节&#xff0c;使得程序间的远程通信如同本地调用一样简单。RPC机制使得开发者能够构建分…

leetcode--恢复二叉搜索树

leetcode地址&#xff1a;恢复二叉搜索树 给你二叉搜索树的根节点 root &#xff0c;该树中的 恰好 两个节点的值被错误地交换。请在不改变其结构的情况下&#xff0c;恢复这棵树 。 示例 1&#xff1a; 输入&#xff1a;root [1,3,null,null,2] 输出&#xff1a;[3,1,null…

Mac下flutter运行iOS模拟器

上篇flutter环境安装&#xff08;Macvscode&#xff09;已经将vscode和xcode等开发环境都搭建起来了&#xff0c;vscode新建工程还是比较方便的&#xff0c;那么&#xff0c;建立好了之后&#xff0c;我们怎么看效果呢&#xff1f; 1. vscode新建项目 通过 vscode的命令命板(…

Collection 和 Collections 的区别与用法

Collection 和 Collections 的区别与用法 1、Collection 接口1.1 主要特点1.2 常见方法 2、 Collections 工具类2.1 主要特点2.2 常见方法 3、示例代码3.1 使用 Collection 接口3.2 使用 Collections 工具类 4、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收…

JAVA从入门到精通之入门初阶(一)

1. 认识变量 一、 首先变量名要遵循如下命名规则&#xff1a; 1. 变量名只能由字母、数字和下划线组成 2. 变量名必须以字母或下划线开头 3. 变量名大小写敏感 4. 变量名不能使用关键字&#xff0c;如const、static等 5. 变量名应具有描述性&#xff0c;以便于代码的可读性…

三级_网络技术_12_路由设计技术基础

1.R1、R2是一个自治系统中采用RIP路由协议的两个相邻路由器&#xff0c;R1的路由表如下图(a)所示&#xff0c;当R1收到R2发送的如下图(b)的(V.D)报文后&#xff0c;R1更新的4个路由表项中距离值从上到下依次为0、3、3、4 那么&#xff0c;①②③④可能的取值依次为()。 0、4、…

240709_昇思学习打卡-Day21-文本解码原理--以MindNLP为例

240709_昇思学习打卡-Day21-文本解码原理–以MindNLP为例 今天做根据前文预测下一个单词&#xff0c;仅作简单记录及注释。 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积 &#x1d44a;_0:初始上下文单词序列&#x1d447;: 时间步当生成EOS标签时&a…

使用OpenCV的absdiff函数报错

1.absdiff用法 absdiff函数用于计算两个输入图像之间每个像素的差异&#xff0c;并返回结果图像。 void cv::absdiff ( InputArray src1,InputArray src2,OutputArray dst ) //eg&#xff1a;比较两图像的差异 /*cv::Mat diff;cv::absdiff(depLeft32, imDepth, diff…

Spring MVC深入理解之源码实现

1、SpringMVC的理解 1&#xff09;谈谈对Spring MVC的了解 MVC 是模型(Model)、视图(View)、控制器(Controller)的简写&#xff0c;其核心思想是通过将业务逻辑、数据、显示分离来组织代码。 Model&#xff1a;数据模型&#xff0c;JavaBean的类&#xff0c;用来进行数据封装…

CLion学习笔记-cmake编译和多main函数编译

这里就不讲怎么配置clion了 项目名字 pcl_kdtree_search 1.新建一个工程名字自己取&#xff0c;我这里用自己学习pcl的&#xff0c;加一个main函数&#xff0c;这个时候Cmake里边就是这样的。 #声明要求的cmake最低版本 cmake_minimum_required(VERSION 3.19) #声明一个工程…

【每日一练】python基础入门实例

""" 幼儿园加法练习题 题数不限 每满100分奖励10个棒棒糖 要求&#xff1a; 1.使用三目运算符与基础运算的对比 2.随机数字相加 3.调用函数 4.循环执行练习题 5.有计算分数 6.有时间停止休眠 """ #导入随机模块 import random #导入时间模块 imp…

华为乾崑智驾加持:深蓝S07首次亮相

最近&#xff0c;特斯拉FSD即将入华的消息&#xff0c;让智能驾驶成为了汽车行业热议的焦点&#xff0c;而当新能源汽车的代表企业深蓝汽车&#xff0c;与全球领先的华为乾崑智驾强强联手&#xff0c;一场颠覆性的智能出行变革也已蓄势待发。 7月8日&#xff0c;深蓝汽车携其最…