1. QT|创建项目|代码解释|main.cpp|widget.h|widget.cpp|widget.ui|Empty.pro(C++)

创建项目

点击新建项目
![[Pasted image 20250315200117.png]]

选择项目模板
![[Pasted image 20250315200134.png]]

Application:应用程序,如果使用QT写一个GUI程序,就应该选这个
QT Widgets Application:图形应用程序项目模板
QT Console Application:控制台程序,TUI
QT Quick:是QT的一套新的用来开发GUI的方式;传统的即使QT Widget
选择QT Widget
![[Pasted image 20250315203825.png]]

选择构建系统
![[Pasted image 20250315203847.png]]

通过QT写的程序,涉及到一系列元编程技术,通过代码来生成代码
QT框架会在编译的时候,自动调用一系列的生成工具,基于写的代码,生成一系列其他的C++代码,最终编译的代码,也就是最后生成的这些代码
qmake是老牌的QT构建工具
cmake并非是QT专属,很多的开源项目都会使用CMake
Qbs是新一代的Qt构建工具
使用qmake
![[Pasted image 20250315204326.png]]

Base class:使用QT Creator创建项目,会自动生成一些代码出来,生成的代码包含一个类,此处就是要选择这个自动生成的类的父类是谁
![[Pasted image 20250315204438.png]]

QMainWindow:完整的应用程序窗口(菜单栏,工具栏,状态栏)
QWidget:表示一个控件(窗口上的一个具体的元素,输入框,按钮,下拉框,单选按钮,复选按钮)
QDialog:表示一个对话框
选择QWidget
![[Pasted image 20250315204651.png]]

此处生成的文件名是和类名关联的
这样的关联并非是强制的
Form file非常关键
QT中创建图形化界面的程序,有两种方式

  1. 直接通过C++代码的方式创建界面
  2. 通过Form file,以图形化的方式来生成界面
    此时,可以采用Qt Designer 或者直接使用Qt Creator来编辑ui文件,从而以图形化的方式快速方便地生成图形界面

选择翻译文件
![[Pasted image 20250315211736.png]]

选择基于哪个编译器的Qt SDK来构建后续代码
![[Pasted image 20250315211922.png]]

工程管理工具
![[Pasted image 20250315212038.png]]

选择git

![[Pasted image 20250315212433.png]]

Empty.pro:工程文件

点击运行空白文件
![[Pasted image 20250315212615.png]]

![[Pasted image 20250315212643.png]]

代码解释

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

argc:命令行参数的个数
argv[]:具体命令行参数的内容
main的形参就是命令行参数
创建了QApplication这样的一个对象,把argc和argv作为构造函数的参数传入
编写一个Qt的图形化界面程序,一定需要有QApplication对象
Widget:就是创建的时候生成的类名
创建一个控件对象,并显示出来
.show():让控件显示出来
.hide():让控件隐藏
Widge的父类是QWidget,都是QWidget提供的
.exec():表示让程序执行起来

Linux中的exec,进程程序替换,把可执行文件中的代码和数据,替换到当前进程中。
Qt中的exec和Linux中exec没有任何关系

widget.h
#ifndef WIDGET_H
#define WIDGET_H
  
#include <QWidget>
  
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
  
class Widget : public QWidget
{
    Q_OBJECT
  
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
  
private:
    Ui::Widget *ui;
};
#endif // WIDGET_H

widget类的声明
#ifndef WIDGET_H
#define WIDGET_H:header guard,保证头文件只能包含一次。更推荐写作#pragma once
一个Ui命名空间,和Form文件生成代码有关,差不多就是声明,声明了这个类class Widget
public QWidget:继承自QWidget,创建项目时选择的父类,是Qt SDK内置的,需要包含对应的头文件 #include <QWidget>
Qt的设定,使用Qt中内置的类,包含的头文件的名字就是和类名是一样的。不是用到的所有的Qt的类都需要显式包含头文件,C++中,头文件可能是间接包含的。
Q_OBJECT:是一个Qt内置的宏,本质上是文本替换,展开之后会生成一大堆代码。Qt中有一个非常核心的机制信号和槽,如果某个类想使用信号和槽,就需要引入Q_OBJECT这个宏
Widget(QWidget *parent = nullptr);
~Widget();:构造函数和析构函数
QWidget *parent = nullptr:Qt中引入了对象树机制,创建的Qt的对象,就可以把这个对象挂到对象树上,往树上挂的时候,就需要指定父节点。对象树就是一个普通的N叉树
Ui::Widget *ui:和form file密切相关

widget.cpp
#include "widget.h"
#include "ui_widget.h"
  
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}
  
Widget::~Widget()
{
    delete ui;
}

#include "widget.h":创建项目生成的头文件
#include "ui_widget.h":form file被qmake生成的头文件

    , ui(new Ui::Widget)
{
    ui->setupUi(this);
}

把form file生成的界面和当前widget关联起来

Widget::~Widget()
{
    delete ui;
}

析构函数

widget.ui

![[Pasted image 20250315221440.png]]

直接双击ui文件,Qt Creator就会直接调用Qt Designer,打开ui文件,图形化的界面编辑器
![[Pasted image 20250315221244.png]]

左边一栏是Qt中内置的控件,可以直接拖拽左侧的控件到中间的程序窗口中,就可以创建出具体的界面。
右侧是编辑属性的区域,可以编辑控件的属性

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>Widget</class>
 <widget class="QWidget" name="Widget">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>800</width>
    <height>600</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Widget</string>
  </property>
 </widget>
 <resources/>
 <connections/>
</ui>

这个格式为xml格式,和html非常类似,都是使用成对的标签来表示数据
Qt中使用xml文件,是为了描述程序的界面是什么样子的,进一步qmake会调用相关的工具,依据xml文件生成一些C++代码,从而把完整的界面构造出来

Empty.pro
QT       += core gui
  
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  
CONFIG += c++11
  
# The following define makes your compiler emit warnings if you use
# any Qt feature that has been marked 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 it uses 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
  
SOURCES += \
    main.cpp \
    widget.cpp
  
HEADERS += \
    widget.h
  
FORMS += \
    widget.ui
  
# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

.pro:当前Qt项目的工程文件,也是qmake构建时候的重要依据
QT += core gui:要引入的Qt模块
CONFIG += c++11:编译选项

SOURCES += \
    main.cpp \
    widget.cpp
  
HEADERS += \
    widget.h
  
FORMS += \
    widget.ui

描述了当前项目中,参与构建的文件都有啥,编译器要编译的文件,类似于Linux中的makefile
qmake搭配.pro起到的作用和makefile类似。
Qt Creator把这个过程中编译的细节都封装好,只需点击运行按钮,就直接编译运行了

总结

.h .cpp .pro .ui都是源代码
编译运行Qt项目,构建过程中还会生成中间文件
打开文件资源管理器
![[Pasted image 20250315223050.png]]

![[Pasted image 20250315223206.png]]

![[Pasted image 20250315223453.png]]

在运行一次程序后,就会在项目目录并列的地方,多出来一个build目录。这个目录里就是该项目运行过程中,生成的一些临时文件。
![[Pasted image 20250315223649.png]]

编译Qt程序还是会用到maikfile。这个makefile是qmake自动生成的
ui_widget.h:就是xml文件生成的.h文件,是代码自动生成的。

/********************************************************************************
** Form generated from reading UI file 'widget.ui'
**
** Created by: Qt User Interface Compiler version 5.14.2
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
  
#ifndef UI_WIDGET_H
#define UI_WIDGET_H
  
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
  
QT_BEGIN_NAMESPACE
  
class Ui_Widget
{
public:
  
    void setupUi(QWidget *Widget)
    {
        if (Widget->objectName().isEmpty())
            Widget->setObjectName(QString::fromUtf8("Widget"));
        Widget->resize(800, 600);
  
        retranslateUi(Widget);
  
        QMetaObject::connectSlotsByName(Widget);
    } // setupUi
  
    void retranslateUi(QWidget *Widget)
    {
        Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));
    } // retranslateUi
  
};
  
namespace Ui {
    class Widget: public Ui_Widget {};
} // namespace Ui
  
QT_END_NAMESPACE
  
#endif // UI_WIDGET_H

Qt自动生成的代码,会在setupUi方法中,生成出界面的具体细节
![[Pasted image 20250315224821.png]]

debug里的.exe就是可执行程序,可以点击运行
![[Pasted image 20250316100023.png]]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值