繁体   English   中英

包含 C++ 头文件

[英]Include C++ header file

目前,我正在学习 C++ GUI--Qt,我对头文件感到困惑。

例如,我想在我的构造函数中使用QHBoxLayout来管理布局。 QHBoxLayoutQVBoxLayout继承自QBoxLayout 。因此, QBoxLayout 头文件不应包含有关QHBoxLayoutQVBoxLayout定义。但它意外地正常工作。

所以我想这可能是 Qt 的一个特性,或者它适用于原生 C++ 语言吗?

#include "dialog.h"
#include <QBoxLayout>

Dialog::Dialog(int tempCelsius, QWidget *parent)
    : QDialog(parent)
{   
    QHBoxLayout *mainLayout = new QHBoxLayout();
    QVBoxLayout *leftLayout = new QVBoxLayout();
    QVBoxLayout *rightLayout = new QVBoxLayout();
    celsiusGroupBox = new QGroupBox(this);
    fahrenheitGroupBox = new QGroupBox(this);
    celsiusDia = new QDial(celsiusGroupBox);
    fahrenheitDia = new QDial(fahrenheitGroupBox);
    celsiusLDNumber = new QLCDNumber(celsiusGroupBox);
    fahrenheitLDNumber = new QLCDNumber(fahrenheitGroupBox);
    celsiusGroupBox->setTitle("Celsius");
    fahrenheitGroupBox->setTitle("Fahrenheit");
    leftLayout->addWidget(celsiusDia);
    leftLayout->addWidget(celsiusLDNumber);
    celsiusGroupBox->setLayout(leftLayout);
    rightLayout->addWidget(fahrenheitDia);
    rightLayout->addWidget(fahrenheitLDNumber);
    fahrenheitGroupBox->setLayout(rightLayout);
    celsiusGroupBox->setLayout(leftLayout);
    mainLayout->addWidget(celsiusGroupBox);
    mainLayout->addWidget(fahrenheitGroupBox);
    setLayout(mainLayout);
}

实际上, QBoxLayout在其中定义了所有三个类。 Qt 这样做,afaik,以减少包含的数量。 这在 C++ 中很常见,因为非常小的类只与它们的父类放在一起。 QHBoxLayoutQVBoxLayout在它们的构造函数/析构函数中都只是“特殊的”。 你可以打开头文件的实现看看。 (注意<QBoxLayout>只包含<qboxlayout.h>

首先,头文件不包含类的定义。 它们只包含类的声明,稍后在相应的 .cpp 文件中定义。 当您从头开始构建库或下载预编译的二进制文件时,这些被编译成静态和动态库,可能是 lQt5Widgets。 然后将其链接到您的程序,以便可以解析所有名称。 所以这实际上不是因为定义在<QBoxLayout>中找到,而是因为<QBoxLayout>包含QHBoxLayoutQVBoxLayout的声明。 以下摘自<qboxlayout.h>代码显示了它们的声明..


113 class Q_WIDGETS_EXPORT QHBoxLayout : public QBoxLayout
114 {
115     Q_OBJECT
116 public:
117     QHBoxLayout();
118     explicit QHBoxLayout(QWidget *parent);
119     ~QHBoxLayout();
120 
121 
122 private:
123     Q_DISABLE_COPY(QHBoxLayout)
124 };
125 
126 class Q_WIDGETS_EXPORT QVBoxLayout : public QBoxLayout
127 {
128     Q_OBJECT
129 public:
130     QVBoxLayout();
131     explicit QVBoxLayout(QWidget *parent);
132     ~QVBoxLayout();
133 
134 
135 private:

它之所以有效,是因为它们是在<QBoxLayout>中声明的,并且您可能正在将它与正确的库链接起来,也可以在它们的定义所在的位置找到它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM