创建项目
点击新建项目
选择项目模板
Application:应用程序,如果使用QT写一个GUI程序,就应该选这个
QT Widgets Application:图形应用程序项目模板
QT Console Application:控制台程序,TUI
QT Quick:是QT的一套新的用来开发GUI的方式;传统的即使QT Widget
选择QT Widget
选择构建系统
通过QT写的程序,涉及到一系列元编程技术,通过代码来生成代码
QT框架会在编译的时候,自动调用一系列的生成工具,基于写的代码,生成一系列其他的C++代码,最终编译的代码,也就是最后生成的这些代码
qmake是老牌的QT构建工具
cmake并非是QT专属,很多的开源项目都会使用CMake
Qbs是新一代的Qt构建工具
使用qmake
Base class:使用QT Creator创建项目,会自动生成一些代码出来,生成的代码包含一个类,此处就是要选择这个自动生成的类的父类是谁
QMainWindow:完整的应用程序窗口(菜单栏,工具栏,状态栏)
QWidget:表示一个控件(窗口上的一个具体的元素,输入框,按钮,下拉框,单选按钮,复选按钮)
QDialog:表示一个对话框
选择QWidget
此处生成的文件名是和类名关联的
这样的关联并非是强制的
Form file非常关键
QT中创建图形化界面的程序,有两种方式
- 直接通过C++代码的方式创建界面
- 通过Form file,以图形化的方式来生成界面
此时,可以采用Qt Designer 或者直接使用Qt Creator来编辑ui文件,从而以图形化的方式快速方便地生成图形界面
选择翻译文件
选择基于哪个编译器的Qt SDK来构建后续代码
工程管理工具
选择git
Empty.pro:工程文件
点击运行空白文件
代码解释
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
直接双击ui文件,Qt Creator就会直接调用Qt Designer,打开ui文件,图形化的界面编辑器
左边一栏是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项目,构建过程中还会生成中间文件
打开文件资源管理器
在运行一次程序后,就会在项目目录并列的地方,多出来一个build目录。这个目录里就是该项目运行过程中,生成的一些临时文件。
编译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方法中,生成出界面的具体细节
debug里的.exe就是可执行程序,可以点击运行