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 gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += 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.0

SOURCES += \
    main.cpp \
    hellodialog.cpp

HEADERS += \
    hellodialog.h

FORMS += \
    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.cpp

HEADERS += \
    hellodialog.h

FORMS += \
    hellodialog.ui

RC_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_NAMESPACE

class 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);
    } // setupUi

    void retranslateUi(QDialog *HelloDialog)
    {
        HelloDialog->setWindowTitle(QCoreApplication::translate("HelloDialog", "HelloDialog", nullptr));
    } // retranslateUi

};

namespace Ui {
    class HelloDialog: public Ui_HelloDialog {};
} // namespace Ui

QT_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 gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

SOURCES += \
    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();
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

睿尔曼复合机器人之底盘操作流程

以操作流程为例&#xff0c;介绍底盘的操作流程。 开机&#xff1a;长按电源按钮&#xff0c;蜂鸣器短响两声&#xff0c;当第三声变长鸣后松开&#xff0c;等待机器开机。 使用&#xff1a; 建立通讯&#xff1a;主要采用无线WiFi与底盘进行通讯连接 无线连接方式&#xff…

android13 Camera加载流程

在 Android O 中,系统启动时,就会启动 CameraProvider 服务。它将 Camera HAL 从 cameraserver 进程中分离出来,作为一个独立进程 android.hardware.camera.provider@2.4-service 来控制 HAL。 这两个进程之间通过 HIDL 机制进行通信。 这样的改动源自于 Android O 版本加…

探索Java中的栈:Stack与Deque(ArrayDeque和LinkedList)

文章目录 1. 栈&#xff08;Stack&#xff09;1.1 定义方式1.2 特点1.3 栈的层次结构 2. 双端队列&#xff08;Deque&#xff09;2.1 定义方式及继承关系2.2 特点&#xff1a;2.3 ArrayDeque2.4 LinkedList2.5 Deque 的各种方法2.6 如何选择ArrayDeque和LinkedList 3. 如何选择…

副业天花板流量卡推广,小白也可轻松操作

在如今的互联网时代&#xff0c;手机已经不仅仅是一款工具&#xff0c;更像是我们生活中的一部分&#xff0c;那么手机卡也是必需品&#xff0c;但存在的问题就是:很多手机卡的月租很贵&#xff0c;流量也不够用。所以大家都在寻找一个月租低&#xff0c;流量多的卡&#xff0c…

echarts可视化大屏入门

效果图&#xff1a; index.less: //css 初始化 * {margin:0;padding:0;box-sizing:border-box; } .box{width:1rem;height:1rem;background-color:pink } li{list-style:none;//消除数字前的圆点 } //声明字体 font-face{font-family:electronicFONT;src:url(../font/DS-DIGIT…

滑动窗口用法

文章目录 1. 长度最小的子数组&#xff08;模板&#xff09;2. 无重复字符的最长字串3. 最小覆盖字串4. 加油站5. 替换字串得到平衡字符串 1. 长度最小的子数组&#xff08;模板&#xff09; 题目分析 直接用步骤分析示例1&#xff0c;[]表示窗口&#xff0c;min_length表示满…

探索网络爬虫:技术演进与学习之路

网络爬虫及IP代理池 前言爬虫技术的演进最新的爬虫技术爬虫技术学习路线 前言 在信息时代&#xff0c;网络爬虫技术作为获取和处理网络数据的重要手段&#xff0c;已经成为数据科学、机器学习和许多商业应用的基石。从简单的HTML页面抓取到复杂的动态内容采集&#xff0c;爬虫…

Excel---一个工作簿中的多个sheet合并成一个PDF

0 Preface/Foreword 1 操作方法 1.1 方法一 文件》 导出 》创建PDF/XPS 》 选项 》发布内容 》“整个工作簿” 1.2 方法二 文件》 打印》 打印机选项中&#xff0c;选择一种PDF阅读器 》设置选项中&#xff0c;选择打印整个工作簿。

Linux:软硬链接及动静态库

一、Linux中的链接文件 1.1硬链接及应用场景 ln//创建硬链接 我们再创建一个硬链接生成的文件。 我们可以看到mlink.hard的inode和makefile.c的inode都是一样的&#xff0c;inode一样里面的数据自然也是一样。相当于对make.file进行了一个重命名&#xff0c;所以硬链接一定没…

计算机网络—HTTPS协议详解:工作原理、安全性及应用实践

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;ヒューマノイド—ずっと真夜中でいいのに。 1:03━━━━━━️&#x1f49f;──────── 5:06 &#x1f504; ◀️ ⏸…

雨云:不只是一阵清风,更是一场暴雨的力量

引言 在网络时代&#xff0c;服务器是任何在线业务的核心。无论你是运营一家小型博客还是承载着数百万用户的大型电商平台&#xff0c;都需要一个稳定、高效的服务器来支持你的业务。然而&#xff0c;在众多服务器提供商中&#xff0c;有一家备受推崇&#xff0c;那就是雨云。 …

electron打包编译国产统信uos系统 arm架构 x86架构 linux mac等环境

electron v21版本以上统信UOS会提示gbm_bo_map错误&#xff0c;可使用v8~v21版本的electron 打包linux包需要再linux系统下运行编译&#xff0c;arch可以指定架构 如果要在统信uos上运行&#xff0c;需要打包成deb格式&#xff0c;在target中修改成deb 或者用第三方软件把app…

数据库设计说明书(Word模板)

2 数据库环境说明 3 数据库的命名规则 4 逻辑设计 5 物理设计 5.1 表汇总 5.2 表结构设计 6 数据规划 6.1 表空间设计 6.2 数据文件设计 6.3 表、索引分区设计 6.4 优化方法 7 安全性设计 7.1 防止用户直接操作数据库 7.2 用户帐号加密处理 7.3 角色与权限控制 8 数据库管理与维…

深入理解Linux系统中的前后台任务与守护进程

⭐小白苦学IT的博客主页 ⭐初学者必看&#xff1a;Linux操作系统入门 ⭐代码仓库&#xff1a;Linux代码仓库 ❤关注我一起讨论和学习Linux系统 1.前言 在Linux系统中&#xff0c;进程管理是至关重要的一个环节。其中&#xff0c;前后台任务和守护进程是进程管理中不可忽视的两…

Intrigue Core:一款功能强大的攻击面枚举引擎

关于Intrigue Core Intrigue Core是一款功能强大的开源攻击面枚举引擎&#xff0c;该工具可以帮助广大研究人员更好地管理应用程序的攻击面。 Intrigue Core集成了各种各样的安全数据源&#xff0c;可以将这些数据提取到标准化的对象模型中&#xff0c;并通过图形数据库跟踪关…

防错设计及原理

目录 1、防错的作用 2、防错的原理 2.1断根原理 2.2保险原理 2.3自动原理 2.4相符原理 2.5顺序原理 2.6隔离原理 2.7层别原理 2.8复制原理 2.9警告原理 2.10缓和原理 防错法&#xff08;Poka-Yoke&#xff09;&#xff0c;又称愚巧法、防呆法&#xff0c;是一种在作…

二叉查找树、二叉搜索树、二叉排序树算法分析及实现

一、几个概念 二叉树&#xff08;Binary Tree&#xff09;&#xff0c;是 n&#xff08;n > 0&#xff09;个结点&#xff08;每个结点最多只有2棵子树&#xff09;的有限集合&#xff0c;该集合或为空集&#xff0c;称为空二叉树&#xff0c;或由一个根节点和两颗互不相交…

如何编译OpenHarmony自带APP

作者&#xff1a;王石 概述 OpenHarmony 的主干代码是开源社区的重要学习资源&#xff0c;对于想进行应用开发和熟悉 OpenHarmony 能力的同学主干代码是非常重要的资源&#xff0c;在主干代码的 applications 目录里聚集了很多原生的应用实现&#xff0c;那么如何编译这些代码…

java:JUnit单元测试

Junit单元测试 介绍 一个用于编写和执行java单元测试的框架,可以帮助开发人员验证代码 单元测试 一种测试方法,用于校验程序中的最小可测试单元(通常是一个方法)是否按照预期工作. JUnit提供了一组注解和断言方法,使编写和执行单元测试变得更加方便 在开发过程中可以频繁…

HarmonyOS开发实例:【菜单app】

简介 分布式菜单demo 模拟的是多人聚餐点菜的场景&#xff0c;不需要扫码关注公众号等一系列操作&#xff0c;通过分布式数据库可以方便每个人可及时查看到订单详情&#xff0c;数量&#xff0c;总额等&#xff1b;效果如下 demo效果 工程目录 完整的项目结构目录如下 ├…