从QMainWindow和Ui_MainWindow继承MainWindow类

时间:2013-06-21 13:57:15

标签: c++ qt inheritance qmainwindow

我正在学习Qt,Qt 5.当我启动Qt Creator并使用所有默认设置创建项目时,我生成了这两个文件,(我不包括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. 我从MainWindowQMainWindow继承Ui_MainWindow类,而Qt Creator的代码仅从QMainWindow类继承。
  3. 我的问题是,使用我的方法有什么不利之处,还是使用Qt Creator的方法有什么好处?请详细解答。

1 个答案:

答案 0 :(得分:4)

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