Включить заголовочный файл C ++ - PullRequest
0 голосов
/ 04 февраля 2020

В настоящее время я изучаю C ++ GUI - Qt, и я запутался в файлах заголовков.

Например, я хочу использовать QHBoxLayout в моей функции конструктора для управления макетом. QHBoxLayout и QVBoxLayout наследуются от QBoxLayout .Hence, файл заголовка QBoxLayout не должен содержать определения о QHBoxLayout или QVBoxLayout. Но он прекрасно работает неожиданно.

Так что я думаю, что это может быть один особенность 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);
}

Ответы [ 2 ]

1 голос
/ 04 февраля 2020

На самом деле, QBoxLayout имеет все три класса, определенные в нем. Qt делает это, афаик, чтобы уменьшить количество включений. Это часто встречается в C ++ для очень маленьких классов, которые просто помещаются вместе с их родительским классом. И QHBoxLayout, и QVBoxLayout являются только "особыми" в своем конструкторе / деструкторе. Вы можете открыть реализацию заголовочных файлов и посмотреть. (обратите внимание, что <QBoxLayout> включает в себя <qboxlayout.h>

0 голосов
/ 04 февраля 2020

Прежде всего, заголовочные файлы не содержат определения классов. Они содержат только объявления классов, которые позже будут определены в соответствующем файле. cpp. Они компилируются в библиотеки stati c и dynamici c, которые, вероятно, являются lQt5Widgets, когда вы собираете библиотеку с нуля или загружаете предварительно скомпилированные двоичные файлы. Затем это связано с вашей программой, так что все имена могут быть разрешены. Так что на самом деле это работает не потому, что определения находятся в <QBoxLayout>, а потому, что <QBoxLayout> содержит объявление для QHBoxLayout и QVBoxLayout. Следующий фрагмент кода из <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>, и вы, вероятно, связываете его с правильной библиотекой также там, где находятся их определения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...