2013-06-21 80 views
3

我正在學習Qt,Qt 5.當我啓動Qt Creator並創建一個包含所有默認設置的項目時,我生成了這兩個文件(我不包括main.cpp和在.pro文件)從QMainWindow和Ui_MainWindow繼承MainWindow類

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_MainWindowMainWindow類,而Qt Creator的代碼僅從QMainWindow類繼承它。

我的問題是,使用我的方法是否有缺點,或者是否有使用Qt Creator的方法的優勢?請給出詳細的答案。

+0

您的項目是否實際編譯? –

+0

是的,兩個版本都按預期工作。爲什麼? –

+0

@Rage在Qt 4天中,元對象編譯器(MOC)不喜歡使用QObject或任何派生類進行多重繼承。 –

回答

4
  1. 命名空間的一個優點是它可以防止命名衝突。所有從QtDesigner自動生成的名字都保留在它們自己的名字空間中。
  2. 將Ui類設爲成員而不是使用多重繼承的一個優點是Ui類只需要在標頭中進行前向裁剪。在你的代碼中,你有一個#include "ui_mainwindow.h",而這又包含了來自QtWidgets的許多包括如<QLabel><QPushButton>等。這大大降低了編譯速度,因爲包括mainwindow.h的每個人現在也包括那些QtWidgets包含的內容。當使用Ui類作爲成員並向前聲明它時,所有這些僅包括在編譯mainwindow.cpp時編譯,而不包括在其他地方包含mainwindow.h