Go最新Qt (1),2024年最新跳槽字节跳动

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

g++ main.cpp -std=c++0x -I"D:\Qt\5.9\mingw53_32\include" -L"D:\Qt\5.9\mingw53_32\lib" -lQt5Core -lQt5Gui -lQt5Widgets -o main

编译链接成功后,在输入main.exe命令就可以看到运行效果。以下是完整流程的截图:

直接使用.ui文件

在本例中,图形界面的构建和设置代码全部交给 createUi 对象了。这就是可视化编程的典型示范,创建和设置图形界面的代码就用 Qt Designer 和 uic 来完成,其他的后台代码自己编写。将开发者从凭空想象图形界面变成直接拖动控件,这样不仅直观,而且开发者需要动手编的代码也变少了。

将图形界面设计和后台功能代码相分离,是现代 GUI 程序设计的通用思路。

多重继承法使用 .ui 文件

上面的代码非常简单,除了 uic 生成的 ui_hello.h 和手动编写的 main.cpp,就没其他的代码文件了。主界面是 QWidget 类的对象,然后该对象比较简单,没有自己的代码。

如果要丰富一下主界面的窗口类,那就需要使用从 QWidget 类继承的方式并加上 Ui::Form 类的代码。C++ 如果要同时使用两个类的代码,有两种方式:

  • 一种是多重继承的方式,同时用 QWidget 和 Ui::Form 类作为基类;
  • 还有一种是使用成员变量,将 Ui::Form 类的对象作为 QWidget 派生类的成员变量,这种也叫单一继承方式,它的基类只有 QWidget。

本小节介绍多重继承方式,而以后的代码都用 QtCreator 自动生成的单一继承方式(Ui::Form 的对象作为成员变量)。

将前面做好的 hello.ui 和 ui_hello.h 复制到 D:\QtDemo 文件夹,然后再新建三个代码文件,分别是 hellouiwidget.h、hellouiwidget.cpp 和 main.cpp ,每个文件的内容如下。

  1. hellouiwidget.h 代码内容
#include <QtWidgets/QWidget>
#include <QtWidgets/QLabel>
#include "ui\_hello.h"
class HelloUIWidget : public QWidget, public Ui::Form
{
    Q_OBJECT
public:
    explicit HelloUIWidget(QWidget \*parent = 0);
    ~HelloUIWidget();
protected:
    void AdjustLabel();
};

hellouiwidget.h 包含了三个头文件 QWidget、QLabel 和 使用 uic 生成的 ui_hello.h ,里面定义了一个类 HelloUIWidget 。HelloUIWidget 从 QWidget、Ui::Form 两个基类继承而来,都是 public 继承方式。由于基类有一个是 Qt 窗口类 QWidget,所以在类定义开始处必须加入 Q_OBJECT 宏,用于声明元对象系统。

该类定义了两个公开类型(public)的函数,即构造函数和析构函数。

最后一个是我们自己编写的保护类型(protected)的函数 AdjustLabel,用于调整 label 标签对象的显示效果。使用多重继承或成员变量的方式就容易丰富窗口类的功能,我们在 HelloUIWidget 里添加了 AdjustLabel 函数,当然还可以添加更多的函数。

  1. hellouiwidget.cpp 文件内容:
#include "hellouiwidget.h"
HelloUIWidget::HelloUIWidget(QWidget \*parent) : QWidget(parent)
{
    setupUi(this);  //必须先调用setupUi 函数
    //TODO:
    AdjustLabel();
}
HelloUIWidget::~HelloUIWidget()
{
    //无需手动删除 Label 组件和 widget 组件,它们会被 Qt 自动删除
}
void HelloUIWidget::AdjustLabel()
{
    label->setText("C语言中文网");
}

在 HelloUIWidget 构造函数定义处,它使用输入参数 parent 初始化了基类 QWidget,另一个基类 Ui::Form 因为它构造函数不需要参数,就没必要手动编写初始化代码,C++ 编译器自己会先构造好基类。

HelloUIWidget 从基类 Ui::Form 继承了 setupUi 函数,所以可直接调用该函数为自己窗口(this)构建图形界面。在构建好图形界面的控件之后,我们再调用自己编写的 AdjustLabel 函数修改标签控件显示效果。

第二个函数是 HelloUIWidget 类的析构函数,里面没有实际代码。仔细观察 ui_hello.h 代码可以发现 label 指针保存的对象是用 new 创建的,而这里我们没有手动 delete 它,因为在 Qt 主窗口关闭时,这些控件会随着主窗口全会被自动销毁,对于控件对象可以不用手动编写 delete 代码。

第三个函数是 AdjustLabel ,这个函数里对 label 指针保存的对象进行处理,label 指针成员变量也是从基类 Ui::Form 继承而来的。AdjustLabel 里面第一句代码:

label->setText(“C语言中文网”);

是设置标签控件显示的文本。

  1. main.cpp 文件内容:
#include <QtWidgets/QApplication>
#include "hellouiwidget.h"
int main(int argc, char \*argv[])
{
    QApplication a(argc, argv);
    HelloUIWidget \*w = new HelloUIWidget();
    w->show();
    return a.exec();
}

代码内容比较简单,main 函数里第一句创建图形程序的入口对象,第二句创建主界面窗口对象,第三句显示主界面窗口,最后一句进入事件循环直到退出为止。窗口对象会在主窗口关闭时自动销毁,所以没有 手动加 delete 代码。

代码分析完了,接下来就是编译生成目标程序了。

  1. 打开 Qt 命令行工具,进入 D:\QtDemo 文件夹:

cd /d D:\QtDemo

  1. 用 uic 生成 ui_hello.h:

uic hello.ui -o ui_hello.h

  1. 用 moc 生成元对象系统代码:

moc hellouiwidget.h -o moc_hellouiwidget.cpp

因为 ui_hello.h 头文件里面没有 Q_OBJECT 宏,所以不需要处理,只给 hellouiwidget.h 生成元对象系统代码就够了。

  1. 生成可执行程序:

g++ moc_hellouiwidget.cpp hellouiwidget.cpp main.cpp -std=c++0x -I"D:\Qt\5.9\mingw53_32\include" -L"D:\Qt\5.9\mingw53_32\lib" -lQt5Core -lQt5Gui -lQt5Widgets -o main

  1. 输入main.exe命令就可以运行生成的程序了。

生成可执行程序的整个流程

用 qmake 生成程序

上面通过自己用 uic、moc、g++ 命令生成目标程序,需要执行的命令是比较多的。之所以费力气讲解编译链接过程的步骤,就是希望读者多了解些知识,如果将来遇上编译或链接时的错误,就可以对号入座,看看大概是哪里出的问题。如果不了解这些过程,可能在编译时少个 ui_.h 或 moc_.cpp 就会傻眼了。

接着我们介绍傻瓜式的生成方法,就是用 qmake 工具。在开始之前,把 D:\QtDemo 文件夹里面生成的中间文件 ui_hello.h、moc_hellouiwidget.cpp、.o 、.exe 全删了,保留我们手动编辑的 hello.ui、hellouiwidget.h、hellouiwidget.cpp、main.cpp 四个文件就够了。

  1. 打开 Qt 命令行工具,进入 D:\QtDemo 文件夹:

cd /d D:\QtDemo

  1. 使用 qmake 生成 .pro 项目文件:

qmake -project “QT+=widgets”

-project选项就是为当前文件夹里的代码创建项目文件,本例子默认得到的是 QtDemo.pro ,就是文件夹名字加上 .pro

QT+=widgets是我们手动给 pro 文件加了一行,添加了 QtWidgets 模块(widgets),pro 文件默认就带有 QtCore(core)和 QtGui(gui)两个模块,不需要手动添加 core 和 gui 。

  1. 使用 qmake 生成 Makefile:

qmake

不带选项和参数的 qmake 默认就是为项目生成 Makefile,运行之后会在项目文件夹里生成 debug 和 release 两个文件夹,以及 Makefile、Makefile.Debug、Makefile.Release 三个生成脚本文件。

  1. 使用 make 工具生成目标程序:

mingw32-make all

这条命令会把调试版和发行版的目标程序全都生成。

  1. 运行生成好的目标程序:
    Debug 调试版本程序:

debug\QtDemo.exe

Release 发行版本程序:

release\QtDemo.exe

运行效果就不重复展示了,和前面的是一样的。

可见用 qmake 生成目标程序就是傻瓜式的三板斧:

  • 先用 qmake -project 生成项目 pro 文件;
  • 再直接用 qmake 生成 Makefile;
  • 最后 make all 。

qmake 把许多 uic、moc、g++ 编译链接过程的命令都自动生成了,全放在 Makefile 脚本里,用起来就特别省事。qmake 创建的各种自动生成命令要比我们自己之前编的命令更为科学合理,感兴趣的读者可以记录一下 mingw32-make 命令执行时命令行里出现的各种生成命令,这些命令都类似于以后的 QtCreator 集成开发环境里面生成程序用的命令。

因为本节引入了 ui 文件,我们来看看本节 pro 文件与《使用qmake工具提升效率》中的有哪些变化:

######################################################################

Automatically generated by qmake (3.1) Wed Jun 5 13:55:11 2019

######################################################################

QT+=widgets
TEMPLATE = app
TARGET = QtDemo
INCLUDEPATH += .

The following define makes your compiler warn you if you use any

feature of Qt which has been marked as deprecated (the exact warnings

depend on your compiler). Please consult the documentation of the

deprecated API in order to know how to port your code away from it.

DEFINES += QT_DEPRECATED_WARNINGS

You can also make your code fail to compile if you use deprecated APIs.

In order to do so, uncomment the following line.

You can also select to disable deprecated APIs only up to a certain version of Qt.

#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000 # disables all the APIs deprecated before Qt 6.0.0

Input

HEADERS += hellouiwidget.h
FORMS += hello.ui
SOURCES += hellouiwidget.cpp main.cpp

使用qmake工具提升效率》中例子没有 hello.ui 文件,本节多的 hello.ui 在 pro 文件里就是对应倒数第二行:

FORMS += hello.ui

img
img

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

85643242)]
[外链图片转存中…(img-rvsrVbCR-1715885643243)]

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值