QT6学习第四天 感受QT的文件编译

QT6学习第四天 感受QT的文件编译

    • 使用纯代码编写程序
      • 新建工程
    • 使用其他编辑器纯代码编写程序并在命令行运行
    • 使用 .ui 表单文件生成界面
    • 使用自定义 C++ 窗口类
    • 使用现成的QT Designer界面类

使用纯代码编写程序

我们知道QT Creator中可以用拖拽的方式在 .ui 文件上布局,同时也会生成代码。
我们来练习纯代码方式来写项目。

新建工程

我们新建一个空项目
在这里插入图片描述

因为书里写的使用Qmake的,我也就用QMake了。CMake你需要了解CMake文件的编写。

创建完成后,会生成一个pro文件,我们在里面写上

greaterThan(QT_MAFOR_VERSION,4):
QT += widgets

因为我们的代码中需要用到的类都包含在Widgets这个模块中。所以在编译文件中要写。
在项目中添加一个main.cpp文件。
在这里插入图片描述
在 main.cpp 中写上我们的代码。

//导入我们要使用的包或类
#include <QApplication>
#include <QDialog>
#include <QLabel>//main函数带有两个参数,第一个是个变量,第二个是一个数组
int main(int argc,char *argv[]){//创建一个 QApplication 对象,来管理应用程序的资源,//每个 QT Widgets 程序都有一个QApplication 对象。//因为QT程序可以接受命令行参数,所以需要 argc 和 argv 俩参数。QApplication a(argc,argv);//创建一个 QDialog 对象 w ,QDialog 类用来实现一个对话框界面QDialog w;//设置w的长宽w.resize(400,300);//创建一个 QLabel 对象 label,第一个参数是 &w 说明将他放在 w 中,& 表示用了引用。QLabel label(&w);//设置 label 的位置,原点是(0,0)label.move(120,120);//设置 label 要显示的字符//QOBject::tr() 可以实现多语言支持,建议所有要显示到界面的字符都用它括起来label.setText(QObject::tr("Hello World! Hello QMake!"));//显示创建的对象,QT 中的对象需要用 show() 才会显示出来。w.show();//让QApplication 对象进入事件循环中,这样 QT 程序运行时便可以接受产生的事件//如鼠标单击、按键盘等。return a.exec();
}

这样我们就自己写了一个超级low的QT程序啦!
运行它吧

使用其他编辑器纯代码编写程序并在命令行运行

我们试试不用QT Creator 使用普通文本编辑器来写程序。通过对比,让大家明白QT Creator只是将编辑、编译、运行等动能进行了集成,其实这些操作都可以我们自己实现,可在帮助索引中通过 Getting Started with qmake关键字查看该部分内容。

我们来新建一个项目。自己找一个路径,在路径下创建一个文本文档,并把我们之前的代码复制过来,最后将文件另存为 main.cpp 编码选择UTF-8,否则中文会乱码。

然后我们开始编译。打开QT 6.8(MinGW 13.1.0 64)命令行,进入我们项目路径,然后输入qmake-project命令来生成 .pro 项目文件。
在 pro 文件中输入

greaterThan(QT_MAJOR_VERSION,4):QT += widget

下面接着在命令行中输入 qmake 命令来生成用于编译的Makefile 文件。之后会出现Makefile 文件、debug和release目录。最后再输入 mingw32-make 命令来编译程序,编译完成后会在 release 文件夹中生成 .exe 文件。如果要生成debug版,只需改变下命令即可。

这里对QT程序的编译过程做一个补充。qmake 是QT提供的编译工具,它可以生成与平台无关的 .pro 文件,然后利用该文件生成与平台相关的 Makefile 文件。Makefile 文件中包含了要创建的目标文件或可执行文件、创建目标文件所依赖的文件和创建每个目标文件时需要运行的命令等信息。最后用 mingw32-make 工具完成自动编译,mingw32-make 就是通过读入 Makefile 文件的内容来执行编译。使用 mingw32-make 时会为每个源文件生成一个对应的 .o 文件,最后将这些目标文件进行链接来生成最终的 .exe 文件。

通过上面的小案例,更能理解QT Creator 是一个将项目目录管理、源代码编辑和程序编译运行等功能集合在一起的集成开发环境(IDE)。

使用 .ui 表单文件生成界面

我们在项目里添加一个 ui 文件,用 ui 文件生成界面来替代前面代码生成的界面,并讲解 ui 文件的作用。然后脱离QT Creator,使用命令行再次编译 ui 文件和整个项目。可以在帮助索引中通过 Using a Designer UI File in Your C++ Application 关键字查看相关内容。

像我们之前添加 main.cpp 文件一样,添加 ui 文件。然后起个名字。
在这里插入图片描述
在这里插入图片描述

添加完成后会直接进入设计模式。在界面上拖入一个 Label 部件,并更改其显示内容为 Hello QT!。然后通过右侧的属性编辑器,在geometry属性中更改坐标位置为 X:120,Y:120。这样就和我们的代码 label.move(120,120) 一致了。接着在右上角的对象查看器中选择QDialog类对象,并在属性编辑器中更改对象名为 Hello QT
在这里插入图片描述

我们回到编辑模式,会看到 ui 文件生成了,其实她是一个 xml 代码文件,里面的代码就是我们设计的界面信息。
我们点击锤子图标构建项目。能发现在 build/debug 路径下生成了 ui 的 .h 头文件。可以看一下里面的内容。

/********************************************************************************
** Form generated from reading UI file 'dialog.ui'
**
** Created by: Qt User Interface Compiler version 6.8.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************///预处理指令,防止对这个头文件的多重包含
#ifndef UI_DIALOG_H
#define UI_DIALOG_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QDialog>
#include <QtWidgets/QLabel>//命名空间开始宏
QT_BEGIN_NAMESPACE//定义一个Ui_HelloQT类,在ui文件中设置的对象名前加了Ui,默认的格式
class Ui_HelloQT
{
public:
//一个QLabel类对象指针,就是ui中添加的Label部件QLabel *Hello;//生成界面的函数,参数类型由我们创建项目时选择的模板决定,这里是Dialogvoid setupUi(QDialog *HelloQT){//设置Dialog名字if (HelloQT->objectName().isEmpty())HelloQT->setObjectName("HelloQT");HelloQT->setEnabled(true);//在HelloQT中创建QLabel对象Hello = new QLabel(HelloQT);//设置label名字Hello->setObjectName("Hello");//设置label位置和大小Hello->setGeometry(QRect(120, 120, 69, 19));//调用retranslateUi函数retranslateUi(HelloQT);//connectSlotsByName是个静态函数,可以让窗口中的部件实现按对象名进行信号和槽的关联。QMetaObject::connectSlotsByName(HelloQT);} // setupUi//定义retranslateUi函数,作用是对窗口里的字符进行编码转换void retranslateUi(QDialog *HelloQT){HelloQT->setWindowTitle(QCoreApplication::translate("HelloQT", "Dialog", nullptr));Hello->setText(QCoreApplication::translate("HelloQT", "TextLabel", nullptr));} // retranslateUi};//定义了命名空间 Ui,其中定义了一个 HelloQT 类,该类继承自 Ui_HelloQT 类
namespace Ui {class HelloQT: public Ui_HelloQT {};
} // namespace Ui//命名空间结束宏
QT_END_NAMESPACE//和第10、11行一起的,配对使用
#endif // UI_DIALOG_H

这里就不难理解,通过 ui 设计界面和纯代码设计界面,效果是一样的,通过 QT Designer 可以直观看到界面,省去写代码的过程。

我们改一下 main.cpp 文件,导入我们的 ui 头文件。并把我们的ui界面添加进去。

#include <ui_dialog.h>int main(int argc,char *argv[]){Ui::HelloQT ui;ui.setupUi(&w);
}

我们来看下在命令行中如何编译带ui的项目。和之前一样,需要把 cpp 和 ui 文件放到一起。

首先编译 ui 文件,还是打开QT 6.8.0(MinGW),进入到目录中,使用 uic 工具编译 ui 文件
输入 uic -o ui_dialog.h dialog.ui 完成后就会生成对应头文件
然后输入 qmake -project 生成 pro 文件,文件中添加 QT += widgets 后
再依次执行如下命令

qmake
ming32-make

这样我们也了解到通过命令行如何编译带 ui 的项目了。

使用自定义 C++ 窗口类

新建一个 qmake 空项目,并且建立一个自定义的 C++ 类,然后使用前面的 ui 文件。通过该示例可感受到QT Creator 中的 Designer 界面类是如何生成的。

  • 创建一个空项目名为,helloworld,完成后打开 pro 文件并写入代码并保存。
greaterThan(QT_MAJOR_VERSION,4):QT += widgets
  • 添加文件。添加 C++ Class 文件,类名为 HelloDial,基类选择自定义,手动填写为 QDialog,其他默认,完成后再添加新的 main.cpp 文件。
    在这里插入图片描述
  • 在 main.cpp 中填写代码
#include <QApplication>
#include "hellodialog.h"int main(int argc,char *argv[]){QApplication a(argc,argv);HelloDialog w;w.show();return a.exec();}
  • 添加 ui 文件,将之前的 ui 文件复制过来,然后选择添加现有文件,选择 之前的 ui 文件。
  • 更改C++类文件。这次没有在main函数中使用 ui 文件,而是在新建的 C++ 类中使用。
    • 先改 hellodialog.h
#ifndef HELLODIALOG_H
#define HELLODIALOG_H#include <QDialog>
//这里是对 HelloDialog 类的前置声明,这样就不用在这里导入 ui_hellodialog.h 头文件了
//在 hellodialog.cpp 中导入即可
namespace Ui{
class HelloDialog;
}class HelloDialog : public QDialog
{//Q_OBJECT宏,扩展了普通C++类的功能,如信号和槽,必须在类定义最开始的部分添加Q_OBJECTpublic://显示构造函数,参数用来指定父窗口explicit HelloDialog(QWidget *parent = nullptr);~HelloDialog();private:Ui::HelloDialog *ui;
};#endif // HELLODIALOG_H

接着改 hellodialog.cpp

#include "hellodialog.h"
#include "ui_helloworld.h"//ui(new Ui::HelloDialog) 等同于 ui = new Ui::HelloDialog;
HelloDialog::HelloDialog(QWidget *parent):QDialog(parent),ui(new Ui::HelloDialog) {ui -> setupUi(this);
}HelloDialog::~HelloDialog(){delete ui;
}

使用现成的QT Designer界面类

  • 新建一个空项目,名字还是helloworld,在pro文件中添加 greaterThan(QT_MAJOR_VERSION,4):QT += widgets

  • 项目中添加新文件,模板选择QT Widgets Designer Form Class

  • 添加一个main.cpp文件,添加代码

#include <QApplication>
#include "dialog.h"int main(int argc,char *argv[]){QApplication a(argc,argv);Dialog w;w.show();return a.exec();
}

它实现和我们刚刚一样的项目。
我们可以得到总结,QT Desiger 类界面项目,就是C++类和ui的结合,他会帮你生成cpp、h、ui文件,不用你自己创建。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

windows安全中心,永久卸载工具分享

使用方法 2024Goby红队版工具分享&#xff0c;附2024年漏洞POC下载 下载链接&#xff1a; https://pan.quark.cn/s/4fc2712a2afc一路回车&#xff0c;选项Y即可 耐心等待几秒种&#xff0c;自动重启 此时打开windows安全中心&#xff0c;已经完全不能使用了&#xff0c;响应…

jvm核心组件介绍

1. 类加载器&#xff08;ClassLoader&#xff09;&#xff1a; • 想象它是一个快递员&#xff0c;负责把Java类&#xff08;.class文件&#xff09;这个“包裹”从磁盘这个“发货地”送到JVM内部这个“目的地”。类加载器确保每个类只被加载一次&#xff0c;并维护一个类的层级…

目标检测,图像分割,超分辨率重建

目标检测和图像分割 目标检测和图像分割是计算机视觉中的两个不同任务&#xff0c;它们的输出形式也有所不同。下面我将分别介绍这两个任务的输出。图像分割又可以分为&#xff1a;语义分割、实例分割、全景分割。 语义分割&#xff08;Semantic Segmentation&#xff09;&…

Python编程技巧:多变量赋值的优雅艺术

在Python编程的世界里&#xff0c;有许多令人惊叹的语法特性&#xff0c;而多变量赋值就像是一颗闪耀的明珠&#xff0c;它不仅让代码更优雅&#xff0c;还能提升程序的执行效率。今天我们就深入探讨这个看似简单却蕴含深意的编程技巧。 基础认识 传统的变量赋值方式&#xff…

CentOS 7 安装部署 KVM

1.关闭虚拟机 打开相关选项 打开虚拟机centos7 连接xshell 测试网络&#xff0c;现在就是没问题的&#xff0c;因为我们要使用网络源 安装 GNOME 桌面环境 安装KVM 模块 安装KVM 调试工具 构建虚拟机的命令行工具 qemu 组件,创建磁盘、启动虚拟机等 输入这条命令&#xff0c;…

微信小程序学习指南从入门到精通

&#x1f5fd;微信小程序学习指南从入门到精通&#x1f5fd; &#x1f51d;微信小程序学习指南从入门到精通&#x1f51d;✍前言✍&#x1f4bb;微信小程序学习指南前言&#x1f4bb;一、&#x1f680;文章列表&#x1f680;二、&#x1f52f;教程文章的好处&#x1f52f;1. ✅…

【C++】读取数量不定的输入数据

读取数量不定的输入数据 似乎是一个很实用的东西&#xff1f; 问题&#xff1a; 我们如何对用户输入的一组数&#xff08;事先不知道具体有多少个数&#xff09;求和&#xff1f; 这需要不断读取数据直至没有新的输入为止。&#xff08;所以我们的代码就是这样设计的&#x…

基于vite创建的react18项目的单元测试

题外话 最近一个小伙伴进了字节外包&#xff0c;第一个活就是让他写一个单元测试。 嗯&#xff0c;说实话&#xff0c;在今天之前我只知道一些理论&#xff0c;但是并没有实操过&#xff0c;于是我就试验了一下。 通过查询资料&#xff0c;大拿们基本都说基于vite的项目&…

如何用通义灵码助力项目开发 | OceanBase obdiag 项目共建实践

本文来自 obdiag 项目共建的用户分享 一、背景 我的数据库探索之旅始于OceanBase。作为一位满怀好奇心的DBA&#xff0c;我内心始终怀揣着对数据库内部运作机制的无尽向往。开源如同一把钥匙&#xff0c;为我们这些求知欲旺盛的“好奇猫”解锁了通往新知的神秘大门。在众多分布…

idea_卸载与安装

卸载与安装 卸载1、设置 -> 应用2、查找到应用&#xff0c;点击卸载3、把删除记录和设置都勾选上4、删除其它几个位置的残留 安装1、下载安装包2、欢迎安装 -> Next3、选择安装目录 -> Next4、创建快捷图标和添加到环境变量5、确认文件夹的名称 -> Install6、完成安…

day01

Hm-Footer.vue <template><div class"hm-footer">我是hm-footer</div></template><script>export default {}</script><style>.hm-footer{height:100px;line-height:100px;text-align:center;font-size:30px;background-…

NLP 1、人工智能与NLP简介

人人都不看好你&#xff0c;可偏偏你最争气 —— 24.11.26 一、AI和NLP的基本介绍 1.人工智能发展流程 弱人工智能 ——> 强人工智能 ——> 超人工智能 ① 弱人工智能 人工智能算法只能在限定领域解决特定的问题 eg&#xff1a;特定场景下的文本分类、垂直领域下的对…

基于混合ABC和A*算法复现

基于混合ABC和A*算法复现 一、背景介绍二、算法原理&#xff08;一&#xff09;A*算法原理&#xff08;二&#xff09;人工蜂群算法原理&#xff08;三&#xff09;混合ABC和A*算法策略 三、代码实现&#xff08;一&#xff09;数据准备&#xff08;二&#xff09;关键函数实现…

解决SpringBoot连接Websocket报:请求路径 404 No static resource websocket.

问题发现 最近在工作中用到了WebSocket进行前后端的消息通信&#xff0c;后端代码编写完后&#xff0c;测试一下是否连接成功&#xff0c;发现报No static resource websocket.&#xff0c;看这个错貌似将接口变成了静态资源来访问了&#xff0c;第一时间觉得是端点没有注册成…

VITE+VUE3+TS环境搭建

前言&#xff08;与搭建项目无关&#xff09;&#xff1a; 可以安装一个node管理工具&#xff0c;比如nvm&#xff0c;这样可以顺畅的切换vue2和vue3项目&#xff0c;以免出现项目跑不起来的窘境。我使用的nvm&#xff0c;当前node 22.11.0 目录 搭建项目 添加状态管理库&…

红外小目标检测

目录 背景概述算法原理演示效果核心逻辑 使用方式基础镜像配置环境直接运行 参考文献 文章声明&#xff0c;非广告&#xff0c;仅个人体验。 背景 红外图像在许多领域中都有所应用。例如军事领域中&#xff0c;经常需要通过红外成像设备对远距离的目标进行侦察和监视&#xff…

【滑动窗口】找到字符串中所有字母异位词

文章目录 找到字符串中所有字母异位词 class Solution { public:vector<int> findAnagrams(string s, string p) {vector<int> ret;int sLen s.size(), pLen p.size(), validChar;// 母串长度比子串长度还小 直接返回空vectorif (sLen < pLen)return ret;// …

nodepad配置c/c++ cmd快速打开创建项目文件

前提:下载MinGw,并且配置环境变量 点击阅读次篇文章配置MinGw 无论是哪个编译器&#xff0c;执行c文件都是经历以下步骤: 编译文件生成exe文件执行该exe文件 我们先手动完成这两部 手动编译文件使用指令 gcc {你的c文件} -o {生成文件名}生成exe文件 第二步运行exe直接点击该文…

Opencv+ROS实现颜色识别应用

目录 一、工具 二、原理 概念 本质 三、实践 添加发布话题 主要代码 四、成果 五、总结 一、工具 opencvros ubuntu18.04 摄像头 二、原理 概念 彩色图像&#xff1a;RGB&#xff08;红&#xff0c;绿&#xff0c;蓝&#xff09; HSV图像&#xff1a;H&#xff0…

Vue.Draggable使用nested-with-vmodel进行拖拽

Vue.Draggable使用nested-with-vmodel进行拖拽 1. 介绍 ‌draggable‌是一个基于Sortable.js的Vue组件&#xff0c;用于实现拖拽功能。它支持触摸设备、拖拽和选择文本、智能滚动、不同列表之间的拖拽等功能&#xff0c;并且与Vue的视图模型同步刷新&#xff0c;兼容Vue2的过…