从QMainWindow和Ui_MainWindow继承一个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. 我从QMainWindowUi_MainWindow继承MainWindow类,而Qt Creator的代码只从QMainWindow类继承它。

我的问题是,使用我的方法是否有任何缺点,或者使用Qt Creator的方法是否有任何优势?

  1. 名称空间的一个优点是它可以防止命名冲突。QtDesigner自动生成的所有名称都保留在自己的命名空间中。
  2. 使Ui类成为成员而不是使用多重继承的一个优点是,Ui类只需要在头文件中前向声明。在您的代码中,您有一个#include "ui_mainwindow.h",并且反过来从QtWidgets(如<QLabel>, <QPushButton>等)中拖动了许多包含。这大大降低了编译速度,因为每个包含mainwindow.h的人现在也包含了那些QtWidgets包含。当使用Ui类作为成员并向前声明它时,所有这些包含只需要在编译mainwindow.cpp时编译,而不是在从其他地方包含mainwindow.h时编译。

相关内容

  • 没有找到相关文章

最新更新