3

我正在学习 Qt,Qt 5。当我启动 Qt Creator 并使用所有默认设置创建一个项目时,我会生成这两个文件,(我不包括 main.cpp 和 .pro 文件)

主窗口.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

主窗口.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从两者继承类QMainWindowUi_MainWindow而 Qt Creator 的代码仅从QMainWindow类继承它。

我的问题是,使用我的方法有什么缺点,还是使用 Qt Creator 的方法有什么好处?请给出详细的答复。

4

1 回答 1

4
  1. 命名空间的一个优点是它可以防止命名冲突。所有从 QtDesigner 自动生成的名称都保留在它们自己的命名空间中。
  2. 使 Ui 类成为成员而不是使用多重继承的一个优点是 Ui 类只需要在标头中进行前向声明。在您的代码中,您有一个#include "ui_mainwindow.h", 并且它又从 QtWidgets 中拖入了很多包含,例如<QLabel><QPushButton>。这会显着降低编译速度,因为mainwindow.h现在包含的每个人也包含 QtWidgets 包含的那些。当使用 Ui 类作为成员并前向声明它时,所有这些包含只需要在编译时编译mainwindow.cpp,而不是mainwindow.h从其他地方包含时。
于 2013-06-21T14:40:35.243 回答