Hello World

张开发
2026/4/10 8:19:53 15 分钟阅读

分享文章

Hello World
图形化方式Qt中Display Widgets里面的标签都是显示类的控件我们用Label就可以控制输出文本拖入编辑即可再看.ui文件就会发现xml多了新的内容qmake会在编译项目的时候基于这个内容生成一段C代码通过这个代码构建出界面生成的ui_widget.h代码中也在setupUi中设置了label对象和参数这里也就挂在了对象树上代码方式Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); }一般通过代码来构建界面的时候通常会把构造界面的代码放到Widget/MainWindow的构造函数中在Widget w;中执行qlabel.h是Qt的上古写法后来响应C风格有了新的QLabel写法创建控件最好在堆上创建在栈上也可以。label对象最好传入this指针指明label的父对象QString是在C还没形成标准时当时怎么表示一个字符串还没有确定可以用C风格的字符串\0结尾也可以使用C的string但是当时的string还不太好用。于是Qt为了让自己开发变顺畅就自己造了一套轮子基础类来开发如QStringQVectorQListQMap。虽然后来C标准也打磨好了但是Qt已经写好的容器也不会删了就只能和标准库的共存了因此在写Qt的时候如果需要使用上面的容器类可以使用标准库的容器也可以使用Qt自己搞的这一套。但是Qt原生的api中涉及到的接口用的都是Qt自己的这一套容器所以后续经常见到QString而比较少遇到std::string用起来更方便一点点QString内部对字符编码做了一些处理#include widget.h #include ui_widget.h #include QLabel Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui-setupUi(this); QLabel* lablenew QLabel(this); lable-setText(Hello World); // QLabel label; } Widget::~Widget() { delete ui; }在QString中也提供了C风格字符串作为参数的构造函数不显示构造QString代码中C风格的字符串也会隐式构造成QString对象QString对应的头文件已经被很多Qt内置类间接包含上述代码在Qt中不会产生内存泄漏label对象在合适的时候会被析构释放虽然没有手动写delete之所以能够把对象释放掉主要是因为把这个对象挂在了对象树上。前端开发网页开发也涉及类似的对象树DOM本质上也是一个树形结构N叉树通过树形结构把界面上的各种元素组织起来。此处通过new的方式创建对象就是为了把这个对象生命周期交给Qt的对象树来统一管理当父对象的窗口销毁了那么子节点对象也会跟着销毁不会造成内存泄漏。但是如果这里使用栈上创建就会随着Widget的构造函数结束而销毁也就看不到文字效果如果没有挂在对象树上一定要记得手动释放创建一个自定义的类最主要的目的是自定义一个析构函数在析构函数中完成打印。通过在构造函数初始化列表中初始化父类将父对象指针传递进去可以将自定义类挂在对象树上#ifndef MYLABEL_H #define MYLABEL_H #include QLabel class MyLabel : public QLabel { public: MyLabel(QWidget* parent); ~MyLabel(); }; #endif // MYLABEL_H#include mylabel.h #include iostream MyLabel::MyLabel(QWidget* parent):QLabel(parent) { } MyLabel::~MyLabel() { std::coutMLabel 被销毁std::endl; }所谓继承本质上是扩展保持原有功能不变的基础上给自己的对象扩展出新的功能通过继承Qt内置类可以达到对现有的控件进行功能扩展效果也可以重写控件中的任何功能不仅仅是析构函数达到功能扩展目的我们会发现此处有输出但是是乱码。乱码问题出现的原因有且仅有一个那就是编码方式不匹配在计算机中一个汉字占几个字节针对这个问题只要回答出具体数字就一定是错的。前提条件当前的中文编码使用的是哪种方式字符集英文字母都是以ASCII码表表示的规定了每个字符都有一个对应的数字表示只是表示英文一个字节足够了。因为英文字母数量少但中文中常用的日常字大概是4K多个算上各种生僻字总数差不多6w左右仍然使用一个大表格给每个汉字分配一个整数即可。对于计算机来说6w多个符号的表格是小问题但是具体每个汉字都用哪个数字表示是不一定的。字符集表示汉字的字符集其实有很多种不同的字符集表示同一个汉字使用的数字不同目前常见的字符集主要是两种GBK中国大陆使用2字节表示一个汉字Windows简体中文版默认字符集就是GBKUTF-8/utf8 变长编码表示一个符号使用的字节数有变化 2-4字节但在utf8中一个汉字一般是3字节Linux中默认一个汉字具体的utf8/GBK编码是多少可以用在线查询网站看如果字符串本身是utf8编码但是终端控制台使用gbk编码解析就会出现乱码拿着utf8的数值去查gbk的表代码中的字符串编码方式与文件的编码方式一样ANSI-GBKQtCreator的终端用的字符串编码不一定是用UTF-8当前表示中文主流的还是UTF-8因为这不止支持中文支持绝大多数世界上的语言。Qt中有一个QSrting可以帮助我们自动处理编码方式不只是QStringQt也专门提供了打日志的工具也能自动处理编码方式qDebugQDebug是Qt中的一个类但我们不会直接使用这个类qDebug是一个宏封装了QDebug对象直接使用qDebug来打日志自带换行重载了 移位运算符C没有输出运算符后续在Qt中想打日志输出调试信息可以使用qDebugcout在Windows对于编码处理不太好但是Linux上用utf8可以使用qDebug还有一个好处就是打印的调试日志是可以统一关闭的。输出的日志是在开发阶段调试程序使用的如果程序发布是不希望用户看到的。qDebug可以通过编译开关来实现一键关闭。调试器很多时候是有局限性的很多时候是无法使用的。比如有些时候bug是一个概率性问题出现的概率可能是1%甚至更小这个时候想调试就要用日志而不是调试器了。无论是哪种方式本质上都是观察执行的中间过程和中间结果

更多文章