1. 程式人生 > >QT中使用自己新建的.ui檔案的方法

QT中使用自己新建的.ui檔案的方法

我今天在新建新的QDialog類檔案的時候很奇怪額發現了生成的東西里面居然沒有了自動生成的xxx.h和xxx.cpp這兩個“套餐檔案”

emmmmm這個時候我就覺得很納悶那我怎麼樣使用這個檔案呢?開始上網搜有關的內容:


其中有一種方法說的就是用uic編譯ui檔案,uic xxx.ui -o ui_xxx.h

但是用這個方法呢,在我的mac下沒有辦法,terminal提示:uic command not found

那也就是說沒有uic?

所以我就想了別的方法。

看看別人的說發:

單繼承方式(The Single Inheritance Approach)

       單繼承方式是相對於後面要講的多繼承方式,單繼承方式也稱組合(即委託或代理)方式。單繼承方式簡單來說就是在程式碼中首先要自定義一個子類(例如下文中的GoToCellDialog類),該類要從form對應的窗體類(或其相容的子類)派生;並用ui生成的類定義一個類裡的成員變數,該成員變數可以是值也可以是指標,根據使用成員變數的形式不同,又分為成員變數和指標成員變數兩種形式。這樣在GoToCellDialog的建構函式中可以直接呼叫ui和ui中的變數和函式,使用起來很方便。

1、使用成員變數

      即將 Ui::GotoCellDialog ui; 作為類GotoCellDialog(只繼承自QDialog,單一繼承)的成員變數。這裡有一點值得注意的地方,就是ui檔案提供的類被包含在了名為Ui的name space裡,這樣做的目的是將ui檔案的名稱空間與使用者的程式碼分離,避免兩者出現命名衝突的情況。


2、使用指標成員變數
       與成員變數形式相似,唯一不同的是,將Ui::GoToCellDialog宣告為指標成員,即 Ui::GoToCellDialog *ui;

因此,相應的標頭檔案中只要前置宣告即可:


    namespace Ui   
    {   
        class GoToCellDialog;   
    } // 前置宣告即可,只在實現檔案中包含相應的標頭檔案   
      
    class GoToCellDialog: public QDialog  
    {   
          // 同上   
     private:   
           Ui::GoToCellDialog *ui;   
    };  

實現檔案:

    #include "ui_gotocelldialog.h"  
      
     GoToCellDialog::GoToCellDialog(QDialog *parent) :  
         QDialog(parent), ui(new Ui::GoToCellDialog)  
     {  
         ui->setupUi(this);  
     }  
      
     CalculatorForm::~CalculatorForm()  
     {  
         delete ui; // 切記刪除,釋放資源  
     }  

還有一種就是多繼承方式,就是使用C++的多繼承

但是我在這裡是這麼實現的(怎麼有種撞大運的感覺TT)

1:新建a.ui

2:新建同名a.h/a.cpp

3:建立的ui是什麼型別的就是要繼承什麼型別的

然後把需要的東西都寫好(就是在.h裡面繼承的,建構函式,Q_OBJECT這類的東西)

最後在a.cpp上面寫#include "ui_a.h"

執行,發現沒有報錯,並且視窗可以顯示!應該是QT裡面的機制在編譯時候發現在同名的ui上面,自動生成ui_xxx.h,所以才會比較奇怪沒有這個檔案卻能;夠執行。我覺得就是QT的執行機制的作用