1. 窗口的UI可视化设计结果转换为代码
(1) 在构建项目时,UI文件widget.ui会被Qt的UIC编译为对应的C++语言文件ui_widget.h,该文件是构建项目时的一个中间文件。
#ifndef UI_WIDGET_H
#define UI_WIDGET_H
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QLabel>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_Widget
{
public:
QLabel *labDemo;
QPushButton *btnClose;
void setupUi(QWidget *Widget)
{
if (Widget->objectName().isEmpty())
Widget->setObjectName(QString::fromUtf8("Widget"));
Widget->resize(271, 162);
QFont font;
font.setPointSize(10);
Widget->setFont(font);
labDemo = new QLabel(Widget);
labDemo->setObjectName(QString::fromUtf8("labDemo"));
labDemo->setGeometry(QRect(65, 40, 156, 35));
QFont font1;
font1.setPointSize(20);
font1.setBold(true);
labDemo->setFont(font1);
btnClose = new QPushButton(Widget);
btnClose->setObjectName(QString::fromUtf8("btnClose"));
btnClose->setGeometry(QRect(160, 105, 81, 31));
retranslateUi(Widget);
QObject::connect(btnClose, &QPushButton::clicked, Widget, qOverload<>(&QWidget::close));
QMetaObject::connectSlotsByName(Widget);
} // setupUi
void retranslateUi(QWidget *Widget)
{
Widget->setWindowTitle(QCoreApplication::translate("Widget", "First Demo", nullptr));
labDemo->setText(QCoreApplication::translate("Widget", "Hello Qt6", nullptr));
btnClose->setText(QCoreApplication::translate("Widget", "Close", nullptr));
} // retranslateUi
};
namespace Ui {
class Widget: public Ui_Widget {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_WIDGET_H
在中间文件中定义了Ui_Widget类,用于封装可视化设计的界面。可以看到Ui_Widget类没有父类,不是从QWidget继承而来,所以Ui_Widget不是一个窗口类。
同时Ui_Widget类中定义了一个函数setupUi()函数,其输入输出参数定义如下:
void setupUi(QWidget *Widget)
可以看到,该函数为QWidget类及其部件上的子类部件设置属性值,并为部件设置信号与槽的关联。
2. 窗口事件是如何与处理程序关联起来
IDE默认生成的QWidget头文件,如下所示:
#include <QWidget>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; } //一个名字空间 Ui,包含一个类 Widget
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr); //构造函数
~Widget(); //析构函数
private:
Ui::Widget *ui; //使用 Ui::Widget 类定义的一个对象指针
};
在Widget类定义的第一行语句插入了一个宏Q_OBJECT,这是使用Qt元对象系统的类时必须插入的一个宏。插入了这个宏之后,Widget类中就可以使用信号与槽、属性等功能。
对应的QWidget的实现文件,如下所示:
#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent) : QWidget(parent), ui(new Ui::Widget)
{
ui->setupUi(this);
}
Widget::~Widget()
{
delete ui;
}
可以看到中间文件ui_widget.h文件在实现文件.cpp中被引用,在构造函数中setupUi被调用,已知setupUi()函数里会创建窗口上所有的界面组件,并以Widget窗口作为所有组件的父容器。而在构造函数中QWidget窗口类作为参数被传入。此时,QWidget窗口类与UI文件产生关联,从而得知对应UI窗口及其内部小部件的属性值和信号与槽、属性等功能。