使用QT Creator新建一个窗口类的项目时,会自动生成四个文件
- main.cpp
- widget.h
- widget.cpp
- widget.ui
其中widget.h和widget.cpp的内容是
#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
****************************************************************************
#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 *ui并在构造函数中调用ui->setupUi(this)
这个Ui::Widget *ui是什么?
在QT Creator中用跳转到其定义,会发现跳转到了build目录中一个叫ui_widget.h的文件(首次需要编译一次才会出现)
ui_widget.h是编译器根据widget.ui生成的
/********************************************************************************
** Form generated from reading UI file 'widget.ui'
**
** Created by: Qt User Interface Compiler version 5.12.9
**
** 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/QPushButton>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_Widget
{
public:
QPushButton *pushButton;
QPushButton *pushButton_2;
void setupUi(QWidget *Widget)
{
if (Widget->objectName().isEmpty())
Widget->setObjectName(QString::fromUtf8("Widget"));
Widget->resize(528, 349);
pushButton = new QPushButton(Widget);
pushButton->setObjectName(QString::fromUtf8("pushButton"));
pushButton->setGeometry(QRect(100, 70, 93, 28));
pushButton_2 = new QPushButton(Widget);
pushButton_2->setObjectName(QString::fromUtf8("pushButton_2"));
pushButton_2->setGeometry(QRect(270, 70, 93, 28));
retranslateUi(Widget);
QMetaObject::connectSlotsByName(Widget);
} // setupUi
void retranslateUi(QWidget *Widget)
{
Widget->setWindowTitle(QApplication::translate("Widget", "Widget", nullptr));
pushButton->setText(QApplication::translate("Widget", "PushButton", nullptr));
pushButton_2->setText(QApplication::translate("Widget", "PushButton", nullptr));
} // retranslateUi
};
namespace Ui {
class Widget: public Ui_Widget {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_WIDGET_H
从定义可以看到这个里面实现了weight.ui中使用到的控件,并对齐布局。
并且会调用QMetaObject::connectSlotsByName(Widget);去连接信号和槽