Qt开发核心笔记:从HelloWorld到对象树内存管理与坐标体系详解

1. HelloWorld

  • 需要创建一个标签,所以要包含头文件 #include <QLabel>
cpp 复制代码
#include "widget.h"
#include "ui_widget.h"
#include <QLabel>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    //更推荐按这种在堆上创建的方式
    QLabel *label=new QLabel(this); //给当前这个label对象指定一个父对象
    label->setText("hello world");
    // QLabel label;
    // label.setText("hello");
}

Widget::~Widget()
{
    delete ui;
}

1.1 关于内存泄漏问题

  • 观察上面的代码,可以发现 QLabel *label=new QLabel(this); 之后是没有delete的
    • 通过new也是为了把对象的声明周期交给Qt的对象树管理
    • this给当前这个label对象指定一个父对象
  • 上述代码不会产生内存泄漏,label对象会在合适的时候被析构释放
    • 这个对象是挂到了对象树上
  • 树上的这些对象,统一销毁是最好的
    • 如果某个对象提前销毁,此时就会导致对应的控件在界面上不存在了

2.命名规范

  • 偏好驼峰式命名Qt
  • 起的名字要有描述性
  • 如果名字比较长需要用适当方式区分不同单词,比如_
    • Qt中偏好使用大写字母来进行单词分割,studentCount,QApplication,QWidget

3. Qt Creator中的快捷键

  • 注释:ctrl+/
  • 运行:ctrl+R
  • 编译:ctrl+B
  • 字体缩放:ctrl+鼠标滑轮
  • 查找:ctrl+F
  • 整行移动:ctrl+shift+↑/↓
  • 帮助文档:F1
  • 自动对齐:ctrl+i
  • 同名之间的.h和.cpp的切换:F4
  • 生成函数声明的对应定义:alt+enter

4. qDebug

  • 头文件==#include <QDebug>==
  • 用这个就不需要关注字符编码了,以后优先使用qDebug
  • qDebug,还有一个好处 ~~ 打印的调试日志,是可以统一进行关闭的
  • 自动换行
cpp 复制代码
qDebug()<<"你好";

5. Qt窗口坐标体系

  • 原点(0,0)是屏幕/窗口的左上角

  • 给Qt的某个空间,设置位置,就需要指定坐标,对于这个控件来说,坐标系原点就是相对于父窗口/控件的

  • QPushButton的父元素/父控件/父窗口就是QWidget

  • QWidget没有父元素(NULL),就相当于父元素就是整个显示器桌面了

  • 坐标单位是像素

6. 控件

6.1 QLabel

  • #include <QLabel>
cpp 复制代码
    QLabel *label=new QLabel(this); //给当前这个label对象指定一个父对象
    label->setText("hello world");

6.2 QLineEdit

  • #include <QLineEdit>
cpp 复制代码
    QLineEdit *edit=new QLineEdit(this);
    edit->setText("hello world");

6.3 QPushButton普通按钮

  • #include <QPushButton>

    复制代码
      QPushButton *push=new QPushButton(this);
      push->setText("hello world");

7. 总结

  • 认识 QLabel类,能够在界面上显示字符串
    • 通过 setText 来设置的,参数 QString(Qt中把 C++ 里的很多容器类,进行了重新封装)
  • 内存泄漏/文件资源泄漏
  • 对象树 Qt 中通过对象树,来统一的释放界面的空间对象
    • Qt 还是推荐使用 new 的方式在堆上创建对象,通过对象树,统一释放对象
    • 创建对象的时候,在构造函数中,指定父对象(此时才会挂到对象树上)
    • 如果你的对象没有挂到对象树上,就必须要记得手动释放
  • 通过继承自 Qt 内置的类,就可以达到对现有控件进行功能扩展效果
    • Qt 内置的QLabel,没法看到销毁过程的。为了看清楚,就创建类 MyLabel,继承自QLabel,重写析构函数
    • 在析构函数中,加上日志,直观的观察到对象释放的过程了
    • 也可以重写控件中的任何功能,不仅仅是析构函数 ~~ 达到功能扩展目的
  • 乱码问题和字符集
    • gbk一个汉字2字节
    • utf-8一个汉字3字节
  • 如何在Qt中打印日志,作为调试信息
    • 推荐用qDebug()
相关推荐
無限進步D5 小时前
Java 运行原理
java·开发语言·入门
是苏浙5 小时前
JDK17新增特性
java·开发语言
阿里加多9 小时前
第 4 章:Go 线程模型——GMP 深度解析
java·开发语言·后端·golang
likerhood9 小时前
java中`==`和`.equals()`区别
java·开发语言·python
zs宝来了10 小时前
AQS详解
java·开发语言·jvm
telllong10 小时前
Python异步编程从入门到不懵:asyncio实战踩坑7连发
开发语言·python
wjs202412 小时前
JavaScript 条件语句
开发语言
阿里加多12 小时前
第 1 章:Go 并发编程概述
java·开发语言·数据库·spring·golang
2301_7926748613 小时前
java学习day29(juc)
java·开发语言·学习