QT系列教程(2) 创建项目和编译

新建Qt Widgets应用

我们启动qt creator 创建项目,选择Qt Widgets应用

https://cdn.llfc.club/1661052788966.jpg

接下来选择项目目录,项目名字就叫helloworld

https://cdn.llfc.club/1661053153461.jpg

构建系统选择qmake

https://cdn.llfc.club/1661053339615.jpg

我们创建一个名字为HelloDialog的类,继承于QDialog

https://cdn.llfc.club/1661054251021.jpg

构建套件选择你们安装的就行了,我这里选择了msvc2019,如果不知道选哪个就全选,系统自己会默认一个。

https://cdn.llfc.club/1661054459226.jpg

接下来一步步完成就可以了,creator会为我们生成代码,在项目目录会多出如下的目录

https://cdn.llfc.club/1661054810123.jpg

我们运行程序后会弹出界面

https://cdn.llfc.club/1661055079773.jpg

同时文件夹里会生成ui文件的类,保存在ui_hellodialog.h文件里

https://cdn.llfc.club/1661055235028.jpg

这个类是用来管理qt desinger 的ui 里的控件的,是自动生成的

我们看一下项目结构

https://cdn.llfc.club/1661055412929.jpg

helloworld.pro是qt 的qmake最终要执行编译时使用的文件,相当于我们用cmake编译时要使用makefile文件一样。

我们点击pro查看以下

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++17# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \hellodialog.cppHEADERS += \hellodialog.hFORMS += \hellodialog.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
  1. 第1行 表示使用qt的core和gui库,如果以后我们想用其他的库,可以往这里添加。
  2. 第3行 表示如果qt的版本大于4,则引入widgets库,因为qt4之前的版本widgets库是不需要引用的,qt4之后需要引用。
  3. 11行主要是告诉编译器要编译的源文件
  4. 15行告诉编译器要编译的源文件
  5. 18行FORMS 描述了要用到哪些ui文件。

接下来我们为刚才的应用添加一个icon,先准备一个head.ico文件,如果没有可以去https://www.bitbug.net/制作一个,然后我们将head.ico放到项目目录里

https://cdn.llfc.club/1661057218556.jpg

然后修改pro文件,新增 RC_ICONS = head.ico 代码

SOURCES += \main.cpp \hellodialog.cppHEADERS += \hellodialog.hFORMS += \hellodialog.uiRC_ICONS = head.ico

然后我们编译生成界面,就可以看到图标了

https://cdn.llfc.club/1661057591328.jpg

接下来我们双击项目目录的hellodialog.ui 会进入Qt Designer界面,然后我们添加一个label,label里写上 “Hello World! Hello Qt!”

https://cdn.llfc.club/1661058027064.jpg

再次运行程序就会弹出新的界面,里面有我们添加的label。

由于新增了label,那么ui文件就会变化,ui文件变化,之前编译生成的ui_hellodialog.h文件也会自动更新
我们查看以下这个文件

#ifndef UI_HELLODIALOG_H
#define UI_HELLODIALOG_H#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QDialog>QT_BEGIN_NAMESPACEclass Ui_HelloDialog
{
public:void setupUi(QDialog *HelloDialog){if (HelloDialog->objectName().isEmpty())HelloDialog->setObjectName(QString::fromUtf8("HelloDialog"));HelloDialog->resize(800, 600);retranslateUi(HelloDialog);QMetaObject::connectSlotsByName(HelloDialog);} // setupUivoid retranslateUi(QDialog *HelloDialog){HelloDialog->setWindowTitle(QCoreApplication::translate("HelloDialog", "HelloDialog", nullptr));} // retranslateUi};namespace Ui {class HelloDialog: public Ui_HelloDialog {};
} // namespace UiQT_END_NAMESPACE#endif // UI_HELLODIALOG_H

定义了一个Ui_HelloDialog类,成员函数setupUi用来指定将ui加载到哪个类对象上。retranslateUi主要是重新翻译一下界面上的文字等信息。Ui_HelloDialog被定义在Ui作用域里。

那这个类Ui_HelloDialog是怎么加载到程序中的呢?
当我们创建对话框程序时,系统自动生成了hellodialog.cpp文件,在HelloDialog的构造函数里创建了Ui_HelloDialog类型对象,并调用setupUi加载了界面。

#include "hellodialog.h"
#include "ui_hellodialog.h"HelloDialog::HelloDialog(QWidget *parent) :QDialog(parent),ui(new Ui::HelloDialog)
{ui->setupUi(this);
}HelloDialog::~HelloDialog()
{delete ui;
}

以上就是整个界面初始化和创建的过程,接下来我们试着单独创建ui文件和cpp文件,加载界面。

创建空项目

先创建一个空项目,然后我们手动添加代码完成和之前程序自动帮我们生成的代码类似的功能。
先创建一个空项目

https://cdn.llfc.club/1661137407572.jpg
操作步骤和之前类似,项目名字就helloworld,编译套件选择自己安装的,点击finish就完成了。
此时项目目录只有一个pro文件。

https://cdn.llfc.club/1661137590473.jpg
接下来我右键单击项目,选择添加C++ 源文件

https://cdn.llfc.club/1661137993637.jpg
文件名就叫main.cpp

https://cdn.llfc.club/1661138096139.jpg
项目里添加main.cpp后,需要在pro里添加widgets说明

greaterThan(QT_MAJOR_VERSION,4): Qt+=widgets

主要原因是qt4以上版本,Qt不包含widgets库,需要引入。另外为了保证我们能使用qt的核心库如QApplication等,我们也要添加gui和core库,这样一个简单的pro文件是这样的

QT       += core guigreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsSOURCES += \main.cpp

然后我们往main.cpp中添加逻辑

#include <QApplication>
#include <QDialog>
#include <QLabel>int main(int argc, char* argv[]){QApplication a(argc, argv);QDialog w;QLabel label(&w);label.setText("Hello World! Hello Qt!");w.show();return a.exec();
}

上述逻辑就是创建了一个对话框w,然后将label设置在w上。然后再调用w显示出来。
然后点击绿色三角运行,可以看到生成界面了
https://cdn.llfc.club/1661139546831.jpg
界面有点小,我们可以重设dialog的大小,以及label的位置

int main(int argc, char* argv[]){QApplication a(argc, argv);QDialog w;QLabel label(&w);label.setText("Hello World! Hello Qt!");w.resize(400,300);label.move(120,120);w.show();return a.exec();
}

再次运行生成界面就正常了

https://cdn.llfc.club/1661139883674.jpg
以上就是通过纯手动的方式添加文件并修改pro完成界面的加载,实际生产中我们多采用creator自动帮我们创建文件和界面的方式。

使用ui文件

我们同样可以创建空项目,并在空项目中引入ui文件,加载界面。
我们在当前项目基础上,添加ui文件
选择Qt的form文件
https://cdn.llfc.club/1661136815676.jpg
然后选择dialog without buttons
https://cdn.llfc.club/1661147196658.jpg
接下来给这个ui命名为hellodialog.ui, 点击完成后进入designer界面,我们在界面上添加一个label,写上"Hello World! Hello Qt!"
https://cdn.llfc.club/1661147918876.jpg

在qt designer里修改label的geometry大小和位置
https://cdn.llfc.club/1661147653094.jpg
修改dialog名字为HelloDialog
https://cdn.llfc.club/1661147764398.jpg
然后我们ctrl s 保存该ui
先运行一下程序,因为之前main函数加载ui还是我们之前的方式写的,所以会弹出界面。我们改一下main函数

#include <QApplication>
#include <QDialog>
#include <QLabel>
#include "ui_hellodialog.h"
int main(int argc, char* argv[]){QApplication a(argc, argv);QDialog w;
//    QLabel label(&w);
//    label.setText("Hello World! Hello Qt!");
//    w.resize(400,300);
//    label.move(120,120);Ui::HelloDialog ui;ui.setupUi(&w);w.show();return a.exec();
}

通过调用ui的setupUi将界面设置给对话框w,然后调用w的show函数。再次运行程序可以显示界面了。

使用自定义的C++类

在上面的项目里我们新增C++类,右键项目目录选择Add New,然后选择C++类
https://cdn.llfc.club/1661149717482.jpg
我们将这个类命名为HelloDialog,Base选择custom,然后写入QDialog
https://cdn.llfc.club/1661149815505.jpg
点击下一步直到完成
此时编译会出问题,因为我们要在生成的hellodialog.h文件里包含Qdialog头文件和ui头文件,并且声明ui成员变量

#ifndef HELLODIALOG_H
#define HELLODIALOG_H#include <QWidget>
#include <QDialog>
#include "ui_hellodialog.h"
class HelloDialog : public QDialog
{
public:HelloDialog();~HelloDialog();
private:Ui::HelloDialog *_ui;
};#endif // HELLODIALOG_H

然后在hellodialog.cpp里加载我们的ui文件

#include "hellodialog.h"
#include "ui_hellodialog.h"
HelloDialog::HelloDialog():_ui(new  Ui::HelloDialog())
{_ui->setupUi(this);
}HelloDialog::~HelloDialog(){delete _ui;
}

修改main.cpp,调用HelloDialog创建界面

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

再次运行就加载了我们的界面。

使用QtDesigner类

其实我们添加一个带界面的类不需要上面那么麻烦,分别创建类和界面,然后再写代码加载,这种方式是正确的但是并不高效,Qt给我们提供了设计师界面类,我们可以直接通过为项目创建一个设计师界面类,自动就会实现类文件和界面的关联。
我们在现有的项目目录右键点击添加New Item,添加设计师界面类
https://cdn.llfc.club/1661153658156.jpg
接下来依旧选择 Dialog without buttons
https://cdn.llfc.club/1661153858363.jpg
只是我们将界面类的名字改为HelloDialog2
https://cdn.llfc.club/1661153976921.jpg
完成后会弹出ui界面,我们在界面添加label,同样写上"Hello World ! Hello Qt!"
我们可以看到qt自动为我们的类生成了代码并加载了ui文件

#include "hellodialog2.h"
#include "ui_hellodialog2.h"HelloDialog2::HelloDialog2(QWidget *parent) :QDialog(parent),ui(new Ui::HelloDialog2)
{ui->setupUi(this);
}HelloDialog2::~HelloDialog2()
{delete ui;
}

接下来我们只要在main.cpp里添加代码完成新界面的加载即可。

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

点击运行同样可以显示我们设计好的界面。
我们实际开发中基本就是以这种方式添加界面类的,方便快捷。

lloDialog2()
{
delete ui;
}

接下来我们只要在main.cpp里添加代码完成新界面的加载即可。
```cpp
#include <QApplication>
#include <QDialog>
#include <QLabel>
#include "hellodialog2.h"
int main(int argc, char* argv[]){QApplication a(argc, argv);HelloDialog2 dialog;dialog.show();return a.exec();
}

点击运行同样可以显示我们设计好的界面。
我们实际开发中基本就是以这种方式添加界面类的,方便快捷。

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

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

相关文章

ELK及ELFK排错

目录 一、ELK及ELFK排错思路 1.1filebeat侧排查 1.2logstash侧排查 1.3ES、kibana侧问题 一、ELK及ELFK排错思路 1.1filebeat侧排查 第一步&#xff1a;排查filebeat上的配置文件有没有写错&#xff0c;filebeat的配置文件是yml文件&#xff0c;一定要注意格式。 第二步…

python botos s3 aws

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3.html AWS是亚马逊的云服务&#xff0c;其提供了非常丰富的套件&#xff0c;以及支持多种语言的SDK/API。本文针对其S3云储存服务的Python SDK&#xff08;boto3&#xff09;的使用进行介绍。 …

男生裤子怎么选?5条永远不会出错的长裤分享

作为一名热衷于分享日常穿搭的博主&#xff0c;我在后台收到了很多粉丝的询问&#xff0c;大家都休息知道哪个品牌的裤子质量更好&#xff0c;而且风格能够适合男生。而且我注意到很多粉丝习惯于在网红直播间下单&#xff0c;对裤子的品牌以及基本品质并不够了解&#xff0c;所…

suno有了新对手udio炸裂音乐圈;又一个开源AI Devin 程序员;完全开源轻量级的文本到语音可生成特定说话者的风格

✨ 1: udio 由音乐和科技界重量级人物支持的强大 AI 音乐生成器&#xff0c;被称为音乐界的另一个 ChatGPT。 Udio 由前 Google DeepMind的研究院和工程师创立&#xff0c;得到了a16z的支持&#xff0c;总部在伦敦和纽约。 目前是一个免费的V1测试版产品&#xff0c;每个人每…

缺失msvcr110.dll要怎么处理?快捷的修复msvcr110.dll方法

当你在使用电脑进行工作或娱乐时&#xff0c;可能会突然遇到一个错误提示&#xff1a;“程序无法启动&#xff0c;因为电脑中缺失msvcr110.dll”。这样的情况不仅会打断你的活动&#xff0c;还可能带来一定程度的不便。面对这个在Windows操作系统中相对常见的问题&#xff0c;其…

在隐私计算应用中和数链具备哪些技术特点?

在加速“可信数字化”进程的背景下&#xff0c;我国区块链产业将在打造新型平台经济&#xff0c;开启共享经济新时代的同时&#xff0c;带动数字经济“脱虚向实”服务实体经济。 和数软件在加速数字化进程的同时&#xff0c;进一步服务实体经济&#xff0c;提高实体经济的活力…

抖音IP打造品牌规划流量运营方案推广计划书

【干货资料持续更新&#xff0c;以防走丢】 抖音IP打造品牌规划流量运营方案推广计划书 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 50页可编辑&#xff08;完整资料包含以下内容&#xff09; 目录 详细的抖音运营方案&#xff0c;帮助品牌在抖音平台上提升…

如何切换PHP版本

如果服务器上安装了多个php&#xff0c;可能会导致默认的php版本错误&#xff0c;无法启动swoole等服务&#xff0c; 查看命令行的php版本方法&#xff1a;https://q.crmeb.com/thread/9921 解决方法如下&#xff0c;选一个即可&#xff1a; 一、切换命令行php版本&#xff0c…

3d怎么按路径制作模型---模大狮模型网

在3D建模中&#xff0c;按路径制作模型是一种常见的技术&#xff0c;特别适用于创建曲线、管道、绳索等线性形状的物体。虽然这项技术可能对初学者来说有些复杂&#xff0c;但通过一步步的指导和实践&#xff0c;你将能够掌握它。本文将详细介绍按路径制作模型的步骤&#xff0…

宁盾radius认证服务器软件如何实现802.1X认证/Portal认证上网(portal web入网认证)

一、什么是802.1X认证和Portal认证以及有什么区别 随着企业网络规模的不断扩大和网络安全威胁的日益加剧&#xff0c;有效的网络认证机制成为保障网络安全的关键。其中&#xff0c;802.1X认证和Portal认证是两种常见的网络认证方式&#xff0c;它们各有特点&#xff0c;适用于…

手动实现简易版RPC(下)

手动实现简易版RPC(下) 前言 什么是RPC&#xff1f;它的原理是什么&#xff1f;它有什么特点&#xff1f;如果让你实现一个RPC框架&#xff0c;你会如何是实现&#xff1f;带着这些问题&#xff0c;开始今天的学习。 接上一篇博客 手动实现简易版RPC&#xff08;上&#xff…

【git】为什么git要有 暂存区

关于git暂存区的个人理解 暂存区 一般存放在 .git 目录下的 index 文件&#xff08;.git/index&#xff09;中。 git中的修改需要先add到暂存区&#xff0c;再commit到本地库&#xff0c;乍一看好像是多此一举了。 看了些别人的讨论&#xff0c;自己也想了很久&#xff0c;…

二叉树应用——最优二叉树(Huffman树)、贪心算法—— Huffman编码

1、外部带权外部路径长度、Huffman树 从图中可以看出&#xff0c;深度越浅的叶子结点权重越大&#xff0c;深度越深的叶子结点权重越小的话&#xff0c;得出的带权外部路径长度越小。 Huffman树就是使得外部带权路径最小的二叉树 2、如何构造Huffman树 &#xff08;1&#xf…

【每日刷题】Day10

【每日刷题】Day10 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f345; 目录 1. 环形链表的约瑟夫问题_牛客题霸_牛客网 (nowcoder.com) 2. 21. 合并两个有序链表 - 力扣&#xff08;LeetCode&#xff09; 3. 152…

灌醉阿里P8大佬!获取内部二进制网络安全学习路线(建议收藏

0x01 二进制学习路线 1.踏实的基础。 基础是很重要的&#xff0c;可以通过计算机体系结构来学习&#xff0c;当然肯定不只是计算机体系结构&#xff0c;还有很多的知识。计算机科学系统基础知识的积累和沉淀&#xff0c;提升自己的计算机科学素养&#xff0c;理解计算机的工作…

windows中anaconda下创建新的新的jupyter环境

https://blog.csdn.net/weixin_43491496/article/details/130325001?spm1001.2014.3001.5502 这里写目录标题 1.1界面化创建虚拟环境1.2命令行创建虚拟环境2.查看是否创建成功3.激活虚拟环境pylessonppt4.更改工作目录5.删除6.查看是否删除成功 1.1界面化创建虚拟环境 1.2命令…

润乾报表平台 InputServlet 任意文件上传漏洞复现

0x01 产品简介 润乾报表是一个纯JAVA的企业级报表工具,支持对J2EE系统的嵌入式部署,无缝集成。服务器端支持各种常见的操作系统,支持各种常见的关系数据库和各类J2 EE的应用服务器,客户端采用标准纯html方式展现,支持ie和netscape, 润乾报表是领先的企业级报表分析软件。…

CPI高于预期!比特币与美股“脱钩”,下挫后急拉盘!减半“护航”下,加密市场四月剧本如何走?

美国劳工部于昨&#xff08;10&#xff09;晚公布了最新的CPI&#xff08;消费者物价指数&#xff09;数据&#xff0c;显示美国3月CPI年增幅达3.5%&#xff0c;不只高于前月的年增3.2%&#xff0c;也高于市场预估的3.4%&#xff0c;表明通货膨胀依然顽固。 高于预期的CPI数据释…

uniapp小程序给指定的页面新增下拉刷新功能

需求:有些页面需要实时更新数据,但是又不能做实时刷新,所以给用户一个手动下拉刷新指定接口的功能 第一步:在pages.json给页面加"enablePullDownRefresh": true配置 第二步:在指定页面写onPullDownRefresh方法,和methods同级 onPullDownRefresh() {//加个定时器1秒…

辉芒微FMD之FT61EC2x

辉芒微的官网&#xff1a;辉芒微电子 FMD | 官方网站 (fremontmicro.com) 1、安装开发环境 一共有如下三款APP&#xff0c; 第一个是 FMDIDE&#xff1b; FMDIDE软件是支持全系列8位MCU的集成开发环境&#xff0c;集代码编辑、分析、编译、调试等功能于一身。 编译器支持C89…