Qt基础

GUI VS CLI

CLI 命令行

在这里插入图片描述

GUI 图形化界面

同时

在这里插入图片描述

事件驱动

在这里插入图片描述

第一个qt项目

在这里插入图片描述

在这里插入图片描述

配置编译工具

在这里插入图片描述

项目的组织结构

在这里插入图片描述

main.cpp

在这里插入图片描述

MainWindow类

ui成员 指向的内容是ui文件绘制的。

在这里插入图片描述

UI::MainWindow 在代码书写时,是不存在的。他是用户画出来的,在编译时产生。

在这里插入图片描述

用纯代码的方式添加UI元素

能不能继承std::string ?

不能,因为QMainWindow 的析构函数是虚函数,std::string 的析构函数不是虚函数

在这里插入图片描述

在这里插入图片描述

两种用法的适用场景

ui 文件 写的人痛苦,看的人舒服

纯代码 写的人很舒服,看的人痛苦

两者结合一般:大框架 用ui文件,小细节 用纯代码

初步了解信号和槽

在这里插入图片描述

使用设计模式,预设的信号关联预设的槽函数

在这里插入图片描述

使用设计模式,预设的信号关联自定义的槽函数

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

实现是,在设计模式的ui中加入 text ,点击按钮,text 变化,不是hello,变为hello,是hello,变为world。

在写代码时,因为lable在ui中,所以用ui进行访问。

在这里插入图片描述

析构函数在C++中的行为与其他普通成员函数(包括虚函数)有一些重要的不同点。尽管它们都涉及到继承和多态性,但在具体实现细节和使用上存在差异。以下是析构函数与普通虚函数机制的主要区别:

1. 调用顺序

  • 析构函数:当一个对象被销毁时,首先调用派生类的析构函数,然后依次调用基类的析构函数,直到最顶层的基类。这个顺序是自底向上的,即从派生程度最高的类到基类。
  • 普通虚函数:当通过基类指针或引用调用虚函数时,实际调用的是指向对象的实际类型对应的版本。这个过程是动态绑定的,但不存在像析构函数那样的自底向上调用链。

2. 自动调用

  • 析构函数:在对象生命周期结束时,析构函数会被自动调用。如果基类的析构函数被声明为虚函数,那么通过基类指针删除派生类对象时,会首先调用派生类的析构函数,然后是每个基类的析构函数。这种机制确保了所有资源都被正确释放。
  • 普通虚函数:需要显式调用,无论是直接通过对象、引用还是指针进行调用。不会自动触发。

3. 继承和覆盖

  • 析构函数:虽然可以说派生类“覆盖”了基类的虚析构函数,但实际上更准确地说是派生类提供了一个自己的析构逻辑,这使得对象销毁时能按正确的顺序清理资源。即使不显式定义析构函数,编译器也会生成一个默认的析构函数,并且如果基类有虚析构函数,派生类的默认析构函数也是虚的。
  • 普通虚函数:派生类可以覆盖基类的虚函数来提供特定于该类的行为。这是典型的多态行为,允许根据对象的实际类型调用相应的函数版本。

4. 实现细节

  • 析构函数:涉及复杂的清理工作,包括释放资源、调用成员变量的析构函数等。因为析构函数可能需要访问基类的保护成员,所以它们的调用机制设计得更为复杂。
  • 普通虚函数:主要关注于运行时动态分发方法调用,其内部实现通常依赖于虚函数表(vtable),但相比析构函数来说,其执行上下文相对简单。

总结

虽然析构函数和其他虚函数都支持多态,但它们的设计目标和实现方式有显著的区别。特别是析构函数的调用遵循严格的顺序,并且涉及到资源的释放和对象的彻底清理,而普通虚函数主要用于实现运行时的方法重写和多态行为。因此,在使用C++时,理解这些差异对于避免内存泄漏和其他资源管理问题至关重要。

使用纯代码的方式,预设的信号,自定义的槽函数

  • 找到发送方和接收方

发送方 button

接收方 MainWindow

  • 设计接受方的槽函数

在这里插入图片描述

  • 关联发送方的信号与接受方的槽函数

    • 在发送方和接收方对象构造完成之后
    • QObject :: connect
      在这里插入图片描述

显示一张图片

设计模式显示

资源

  • 找到资源,复制到项目所在文件夹
  • 创建一个qru文件

在这里插入图片描述

  • 新建一个textlabel,并修改属性

在这里插入图片描述

纯代码模式显示

  • 将资源拷贝到项目的文件夹
  • 新建一个qrc文件
  • 根据资源的路径构造Qpixmap
  • 调用label的setPixmap方法

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐