包括C++;头文件 目前,我正在学习C++ GUI——QT,我对头文件感到困惑。
例如,我想在构造函数中使用包括C++;头文件 目前,我正在学习C++ GUI——QT,我对头文件感到困惑。,c++,qt,C++,Qt,例如,我想在构造函数中使用QHBoxLayout来管理布局。 QHBoxLayout和QVBoxLayout继承自QBoxLayout。因此,QBoxLayout头文件不应包含关于QHBoxLayout或QVBoxLayout的定义。但它工作正常 P>这可能是QT的一个特性,或者它对原生C++语言有作用吗? #include "dialog.h" #include <QBoxLayout> Dialog::Dialog(int tempCelsius, QWidget *pare
QHBoxLayout
来管理布局。
QHBoxLayout
和QVBoxLayout
继承自QBoxLayout
。因此,QBoxLayout头文件不应包含关于QHBoxLayout
或QVBoxLayout
的定义。但它工作正常
<> P>这可能是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);
}
#包括“dialog.h”
#包括
Dialog::Dialog(int-tempcellius,QWidget*父项)
:QDialog(父级)
{
QHBoxLayout*mainLayout=新的QHBoxLayout();
QVBoxLayout*leftLayout=新的QVBoxLayout();
QVBoxLayout*rightLayout=新的QVBoxLayout();
celsiusGroupBox=新的QGroupBox(本);
fahrenheitGroupBox=新的QGroupBox(此);
Celsiusia=新QDial(celsiusGroupBox);
华氏温度=新的QDial(华氏温度分组框);
celsiusLDNumber=新的QLCDNumber(celsiusGroupBox);
fahrenheitLDNumber=新的QLCDN编号(fahrenheitGroupBox);
celsiusGroupBox->setTitle(“摄氏度”);
华氏组框->设置标题(“华氏”);
leftLayout->addWidget(celsiusDia);
leftLayout->addWidget(celsiusLDNumber);
celsiusGroupBox->setLayout(左布局);
rightLayout->addWidget(华氏度);
rightLayout->addWidget(华氏数);
华氏组框->设置布局(右布局);
celsiusGroupBox->setLayout(左布局);
mainLayout->addWidget(celsiusGroupBox);
mainLayout->addWidget(华氏组框);
设置布局(主布局);
}
实际上,QBoxLayout
中定义了所有三个类。Qt这样做是为了减少包含的数量。在C++中,对于非常小的类,通常只使用它们的父类。QHBoxLayout
和QVBoxLayout
在其构造函数/析构函数中都只是“特殊的”。您可以打开头文件的实现并进行查看。(请注意,
只包含首先,头文件不包含类的定义。它们只包含类的声明,这些声明稍后在相应的.cpp文件中定义。当您从scrat构建库时,这些声明被编译成静态和动态库,可能是lQt5Widgetsch或下载预编译的二进制文件。然后将其链接到您的程序,以便解析所有名称。因此,这实际上并不是因为定义位于
中,而是因为
包含QHBoxLayout
和QVBoxLayout
的声明。
下面从
中提取的代码显示了它们的声明
113类Q_WIDGETS_导出QHBoxLayout:公共QBoxLayout
114 {
115 Q_对象
116公众:
117 QHBoxLayout();
118明确的QHBoxLayout(QWidget*父项);
119~QHBoxLayout();
120
121
122私人:
123 Q_禁用_复制(QHBoxLayout)
124 };
125
126类Q_WIDGETS_导出QVBoxLayout:公共QBoxLayout
127 {
128 Q_对象
129公众:
130 QVBoxLayout();
131显式QVBoxLayout(QWidget*父项);
132~QVBoxLayout();
133
134
135私人:
它之所以能工作,是因为它们是在
中声明的,并且您可能正在将它链接到正确的库中,在那里也可以找到它们的定义。请注意,由于C++预处理器的工作方式,您可能会意外地通过包含所需文件的其他头文件“拉入”类型。因此,仅仅因为“它工作正常”并不总是意味着它是正确的。我不认为这是重复的,但您可能会发现讨论很有帮助:#include
#include
与添加几乎所有类的#include
类似吗?类是在头文件中定义的。类的函数通常在头文件中声明,在头文件中定义源代码。但类本身已定义。请参见标准的[class]/1,2
和[class.name]/1
。