目录
- 1. pro文件内容解释
- 2. main文件内容解释
- 3. widget.cpp/widget.h文件内容解释
- 4. ui_widget.h文件内容解释
- 5. widget.ui文件内容解释
以Widget
窗口部件项目为例,新建的工程目录有如下几个文件:
QtCreator软件将他们做了如下分组,包含三个文件夹和一个.pro文件:
他们的作用分别为:
- .pro文件:项目文件,定义项目相关信息,是
qmake
用来生成makefile
文件的中间文件; - .pro.user文件:定义与用户相关的项目信息;
- /Headers文件夹:存放头文件;
- /Sources文件夹:存放源文件;
- /Forms文件夹:存放ui文件;
1. pro文件内容解释
详见Qt 学习(二) —— .pro文件详解
2. main文件内容解释
以Widget
窗口部件项目为例,解释一下main函数内容:
#include "widget.h"
#include <QApplication>
// Qt应用程序入口
// main()函数主要执行一些初始化工作,然后将控制转交给Qt库
// 然后Qt库通过事件向程序告知用户行为
int main(int argc, char *argv[])
{
// Qt应用程序类,实例化Qt应用程序对象a
QApplication a(argc, argv);
// 创建一个窗口对象,这里调到widget.cpp中
Widget w;
// 窗口部件默认不可见,要调用show()方法使它可见
w.show();
// 程序进入消息循环,即main()函数将控制权转交给Qt
// 当应用程序退出的时候,exec()函数就会返回
// 在exec()函数中,Qt接收处理用户和系统的事件并将它们传递给适当的窗口部件
return a.exec();
}
3. widget.cpp/widget.h文件内容解释
在main函数中实例化了Widget
窗口对象,这里介绍一下widget.cpp
和widget.h
中的代码:
widget.cpp
#include "widget.h"
#include "ui_widget.h" // 窗口ui头文件,用于初始化ui及拖拽控件对象
// Widget构造函数
// 其中将ui初始化为Ui::Widget,该类位于ui_widget.h中,用于初始化ui及拖拽控件对象
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
// 为Ui对象传入当前窗口对象指针
// 即将当前窗口对象与其Ui绑定
ui->setupUi(this);
}
// Widget析构函数
Widget::~Widget()
{
delete ui;
}
widget.h
// 条件编译,防止头文件被重复引用
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
// QT的命名空间,其实就是C++的命名空间封装了一层,如下是该宏定义:
// # define QT_BEGIN_NAMESPACE namespace QT_NAMESPACE {
// # define QT_END_NAMESPACE }
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; } // 声明Ui命名空间下的Widget类
QT_END_NAMESPACE
// 定义Widget类
class Widget : public QWidget
{
// Q_OBJECT宏用于提供Qt信号槽和元对象系统服务
// 它必须限定为私有访问权限
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
private:
// 创建Ui::Widget类型的指针,用于操作ui界面及其控件
Ui::Widget *ui;
};
#endif // WIDGET_H
4. ui_widget.h文件内容解释
该文件初始化了ui及拖拽控件对象,由widget.ui
文件生成,所以不能手动修改,即使修改也会在下次编译被覆盖。
#pragma once // 避免头文件被重复引用
// Qt头部声明
/********************************************************************************
** Form generated from reading UI file ''
**
** Created by: Qt User Interface Compiler version 6.3.0
**
** WARNING! All changes made in this file will be lost when recompiling UI file!
********************************************************************************/
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
// 该类用于初始化ui及拖拽控件对象
class Ui_Widget
{
public:
// 该函数用于初始化窗口及创建窗口中的控件对象
void setupUi(QWidget *Widget)
{
if (Widget->objectName().isEmpty())
Widget->setObjectName(QString::fromUtf8("Widget"));
Widget->resize(800, 600);
retranslateUi(Widget);
// Qt元对象系统生成信号与槽的连接
// 递归搜索给定对象的所有子对象,并将来自这些子对象的匹配信号连接到对象插槽
// 所连接的槽函数要按特定形式的定义,如下:
// void on_<object name>_<signal name>(<signal parameters>);
QMetaObject::connectSlotsByName(Widget);
} // setupUi
// 动态翻译Ui界面的文字,用于国际化
void retranslateUi(QWidget *Widget)
{
Widget->setWindowTitle(QCoreApplication::translate("Widget", "Widget", nullptr));
} // retranslateUi
};
namespace Ui {
// 声明Ui对应的类继承于该Ui类
class Widget: public Ui_Widget {};
} // namespace Ui
QT_END_NAMESPACE
5. widget.ui文件内容解释
该文件为xml格式,类似于HTML,用于表示ui界面,Qt根据该文件生成ui_widget.h文件,Qt Creator可将其解析为图形界面,文件内容如下:
<?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 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 class="QPushButton" name="pushButton">
<property name="geometry">
<rect>
<x>140</x>
<y>140</y>
<width>231</width>
<height>71</height>
</rect>
</property>
<property name="styleSheet">
<string notr="true"/>
</property>
<property name="text">
<string>PushButton</string>
</property>
</widget>
</widget>
<resources/>
<connections/>
</ui>
对应的图形界面如下: