Наследование класса MainWindow из QMainWindow и Ui_MainWindow

Я изучаю Qt, Qt 5. Когда я запускаю Qt Creator и создаю проект со ВСЕМИ настройками по умолчанию, я получаю эти 2 сгенерированных файла (я исключаю main.cpp и файл .pro)

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private:
Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}

MainWindow::~MainWindow()
{
delete ui;
}

Теперь я предпочитаю делать это так,

my_mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "ui_mainwindow.h"

class MainWindow : public QMainWindow, private Ui_MainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
};

#endif // MAINWINDOW_H

my_mainwindow.cpp

#include "my_mainwindow.h"#include <QMessageBox>

MainWindow::MainWindow(QWidget *parent) :   QMainWindow(parent)
{
setupUi(this);
}

MainWindow::~MainWindow()
{

}

Вот основные различия между моим кодом и кодом Qt Creator:

  1. нет namespace Ui в моем коде. (Может ли кто-нибудь объяснить мне, как использовать это пространство имен здесь?)
  2. Я наследую MainWindow класс из обоих QMainWindow а также Ui_MainWindow тогда как код Qt Creator наследует его только от QMainWindow учебный класс.

Мой вопрос заключается в том, есть ли ЛЮБОЙ недостаток в использовании моего подхода или есть какое-то преимущество в использовании подхода Qt Creator? Пожалуйста, дайте подробный ответ.

3

Решение

  1. Преимущество пространства имен заключается в том, что оно предотвращает конфликты имен. Все автоматически сгенерированные имена из QtDesigner остаются в своем собственном пространстве имен.
  2. Преимущество создания класса Ui в качестве члена вместо использования множественного наследования заключается в том, что класс Ui необходимо только с предварительным объявлением в заголовке. В вашем коде у вас есть #include "ui_mainwindow.h"и это, в свою очередь, тянет во много включений из QtWidgets, как <QLabel>, <QPushButton> и т.д. Это значительно снижает скорость компиляции, так как каждый, кто включает mainwindow.h теперь также включает эти QtWidgets включает. При использовании класса Ui в качестве члена и объявлении его вперед все эти включения должны компилироваться только при компиляции mainwindow.cpp, но не при включении mainwindow.h откуда-то еще
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]