(1)以此简单的例子进行分析 :
(2)一并给出 这个 ui_widget . h 头文件 :
#ifndef UI_WIDGET_H
#define UI_WIDGET_H
#include <QtCore/QVariant>
#include <QtWidgets/QApplication>
#include <QtWidgets/QListView>
#include <QtWidgets/QPushButton>
#include <QtWidgets/QVBoxLayout>
#include <QtWidgets/QWidget>
QT_BEGIN_NAMESPACE
class Ui_Widget
{
public:
QVBoxLayout * verticalLayout; //堆区的布局,按钮,视图,都是要被析构的
QPushButton * pushButton; //幸好的是,在堆区构造这些对象的时候,其父类都设置为了所在的窗体 QWidget 容器
QListView * listView; //即下面的函数 setupUi(QWidget * Widget) 里形参指出的这个窗体容器。
void setupUi(QWidget * Widget)
{
if (Widget->objectName().isEmpty())
Widget->setObjectName(QString::fromUtf8("Widget"));
Widget->resize(188, 224);
QFont font;
font.setPointSize(14);
Widget->setFont(font);
Widget->setContextMenuPolicy(Qt::CustomContextMenu);
verticalLayout = new QVBoxLayout(Widget); //所在的父类容器是本函数的形参窗体对象
verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));
pushButton = new QPushButton(Widget); //所在的父类容器是本函数的形参窗体对象
pushButton->setObjectName(QString::fromUtf8("pushButton"));
verticalLayout->addWidget(pushButton);
listView = new QListView(Widget); //所在的父类容器是本函数的形参窗体对象
listView->setObjectName(QString::fromUtf8("listView"));
verticalLayout->addWidget(listView);
retranslateUi(Widget);
QMetaObject::connectSlotsByName(Widget);
} // setupUi
void retranslateUi(QWidget *Widget)
{
Widget->setWindowTitle(QCoreApplication::translate("Widget", "H" , nullptr));
pushButton ->setText(QCoreApplication::translate("Widget", "pushButton", nullptr));
} // retranslateUi
};
namespace Ui {
class Widget: public Ui_Widget {};
} // namespace Ui
QT_END_NAMESPACE
#endif // UI_WIDGET_H
(3)画图帮助演示下本程序里涉及的变量、对象的内存分布 :
(4)
谢谢