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

news2024/11/24 20:43:54

新建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();
}

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

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

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

相关文章

SV-704XT 100W网络有源音柱 校园广播音柱

SV-704XT 100W网络有源音柱 一、描述 SV-704XT是深圳锐科达电子有限公司的一款壁挂式网络有源音柱&#xff0c;具有10/100M以太网接口&#xff0c;可将网络音源通过自带的功放和喇叭输出播放&#xff0c;其采用防水设计&#xff0c;功率100W。SV-704XT作为网络广播播放系统的终…

嵌入式:第二天(C语言入门)

目录 一、基础语法 位运算符&#xff1a; & -&#xff08;与运算&#xff09; | -&#xff08;或运算&#xff09; ^ -&#xff08;异或运算&#xff09; ~ -&#xff08;取反运算&#xff09; << -&#xff08;左移运算符&#xff09; >> -&#xff0…

MyBatis 中的动态 SQL 的相关使用方法

为什么会有动态SQL&#xff0c;把SQL写死不是比较方便吗&#xff1f;其实有很多的举例&#xff0c;这里我那一个常见的来说&#xff0c;像我们用户注册&#xff0c;会有必填字段和非必填字段&#xff0c;有些传来的参数不一样&#xff0c;那对应的SQL也不一样&#xff0c;因此&…

【ctf.show】获得百分之百的快乐

1.打开靶场 2.根据页面代码&#xff0c;get请求值只能小于4位数&#xff0c;否则会回显hack&#xff01; 尝试后确实是这样的&#xff1a; 请求值小于4位数&#xff0c;页面无变化&#xff1a; 发送请求值ls查看内容 3.根据2返回的值&#xff0c;发送值为?1>nl 创建一个nl…

每日一练(力扣)

我的思路是暴力枚举: 情况1:相同&#xff0c;就让子串和原串同时后移继续比较 情况2:不相同&#xff0c;就只让原串后移 public int strStr(String haystack, String needle) {if (haystack.length() < needle.length()){return -1;}for (int i 0; i < h…

Java | Leetcode Java题解之第15题三数之和

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> threeSum(int[] nums) {int n nums.length;Arrays.sort(nums);List<List<Integer>> ans new ArrayList<List<Integer>>();// 枚举 afor (int first 0;…

Harmony鸿蒙南向外设驱动开发-Audio

Audio驱动概述 多媒体系统是物联网设备开发中不可缺少的一部分&#xff0c;Audio作为其中重要的一个模块&#xff0c;Audio驱动模型的构建显得尤为重要。 本文主要介绍基于HDF&#xff08;Hardware Driver Foundation&#xff09;驱动框架开发的Audio驱动&#xff0c;包括Aud…

2023年蓝桥杯——日期统计

目录 题目链接&#xff1a;1.日期统计 - 蓝桥云课 (lanqiao.cn) 题目描述 思路 代码思路 定义数据结构&#xff1a; 处理每一个月&#xff1a; 检查日期序列在num100中是否存在&#xff1a; 计数匹配的日期数&#xff1a; 输出结果&#xff1a; 代码实现 总结 题目链…

面试:线程和线程池

目录 目标 一、线程有哪些状态 1、新建态&#xff08;NEW&#xff09;&#xff1a; 2、可运行态&#xff08;RUNNABLE&#xff09;&#xff1a; 3、终结态&#xff08;TERMINATED&#xff09;&#xff1a; 4、阻塞态&#xff08;BLOCKED&#xff09;&#xff1a; 5、等待态…

kafka快速入门+应用

Kafka, 构建TB级异步消息系统 1.快速入门 1.1 阻塞队列 在生产线程 和 消费线程 之间起到了 &#xff0c; 缓冲作用&#xff0c;即避免CPU 资源被浪费掉 BlockingQueue 解决 线程通信 的问题阻塞方法 put 、 take生产者、消费者 模式 生产者&#xff1a;产生数据的线程…

使用Mac自带终端进行远程ssh连接Linux服务器

废话不多说&#xff0c;直接上图 好吧&#xff0c;我承认我是多此一举&#xff0c;脱裤子放pi了&#xff0c;其实只需要在终端输入一行命令就可以了&#xff08;呜呜&#xff5e;&#xff09; ssh rootip -p 22 需要注意的是&#xff0c;命令里的ip地址同样要替换成你自己的服…

云LIS系统源码,ASP.NET区域LIS系统源码,实验室信息系统

云LIS系统源码&#xff0c;ASP.NET区域LIS系统源码&#xff0c;实验室信息系统 LIS技术架构&#xff1a;ASP.NET CORE 3.1 MVC SQLserver Redis等 开发语言&#xff1a;C# 6.0、JavaScript 前端框架&#xff1a;JQuery、EasyUI、Bootstrap 后端框架&#xff1a;MVC、S…

阿里云服务器带宽价格全解析,附报价单

阿里云服务器公网带宽怎么收费&#xff1f;北京地域服务器按固定带宽计费一个月23元/M&#xff0c;按使用流量计费0.8元/GB&#xff0c;云服务器地域不同实际带宽价格也不同&#xff0c;阿里云服务器网aliyunfuwuqi.com分享不同带宽计费模式下带宽收费价格表&#xff1a; 公网…

十五届web模拟题整理

模拟赛一期 1.动态的Tab栏 请在 style.css 文件中补全代码。 当用户向下滚动的高度没有超过标题栏&#xff08;即 .heading 元素&#xff09;的高度时&#xff0c;保持 Tab 栏在其原有的位置。当滚动高度超过标题栏的高度时&#xff0c;固定显示 Tab 栏在网页顶部。 /* TODO…

03 SQL基础 -- 查询与运算符

一、SELECT 语句基础 1.1 从表中选取数据 SELECT 语句 从表中选取数据时需要使用SELECT语句,也就是只从表中选出(SELECT)必要数据的意思。通过SELECT语句查询并选取出必要数据的过程称为匹配查询或查询(query) 基本SELECT语句包含了SELECT和FROM两个子句(clause)。示…

PointNet++函数square_distance(src, dst):计算两组点之间的欧式距离(代码详解)

文章目录 一、计算两组点之间的欧式距离二、举例三、中间结果输出 一、计算两组点之间的欧式距离 def square_distance(src, dst):"""Calculate Euclid distance between each two points.src^T * dst xn * xm yn * ym zn * zm&#xff1b;sum(src^2, dim-1…

模块化组合优势凸显钡铼IOy系列轻松应对大规模工业自动化工程

模块化组合是钡铼IOy系列独立式I/O模块的一大优势&#xff0c;它为大规模工业自动化工程提供了灵活性、可扩展性和定制性&#xff0c;从而轻松应对不同规模和复杂度的工厂应用。以下是关于模块化组合优势的详细解析&#xff1a; 1. 灵活性和定制性 模块化设计使得钡铼IOy系列…

字节Coze实现多Agent模式,文内在线体验,实时给产品经理提需求

摘要&#xff1a; 多Agent模式是一种分布式计算范式&#xff0c;它通过将复杂任务分解为多个子任务&#xff0c;并由独立的智能体&#xff08;Agents&#xff09;并行处理&#xff0c;从而提高系统的处理能力和效率。这种模式在自然语言处理、机器学习和其他数据密集型应用中尤…

未来汽车硬件安全的需求(1)

目录 1.概述 2.EVITA 2.1 EVITA HSM 2.2 EVITA保护范围 3.市场变化对车载网络安全的影响 3.1 非侵入式攻击的风险 3.2 量子计算机的蛮力攻击 3.3 整车E/E架构的变化 3.4 网络安全标准和认证 3.5 汽车工业的网络安全措施 4.汽车安全控制器 4.1 TPM2.0 4.2 安全控…

【2024最新】微信公众号怎么开启留言功能

关注微信公众号&#xff1a;怒码少年&#xff0c;回复关键词【电子书】可以免费获取计算机相关电子书 本文首发于&#xff1a;原文阅读-wx公众号&#xff1a;怒码少年 大家好&#xff0c;我是小码。 微信公众号从18年开始&#xff0c;正式关闭了留言功能。自此以后新注册的公…