2011-01-10 81 views
4

我看到的Qt把一個類Ui接口裏面是這樣的:把類命名空間內

namespace Ui { 
    class MainWindow; 
} 

class MainWindow : public QMainWindow 
{ 
    ... 

這是方法一樣封閉的命名空間內整個班級?它當然看起來更清潔。

+0

在Qt中你看到了這個?你能提供一個鏈接嗎?它是有效的C++,但就編譯器而言,全局名稱空間中的「MainWindow」和「Ui」名稱空間是不同的類。除非`MainWindow``實際在`Ui`命名空間內,但是你錯過了它。請注意,命名空間可以跨多個文件分割。 – 2011-01-10 05:16:56

+0

@Insilico當我創建一個新的GUI項目時,我會看到它。嘿,我自己並不真正瞭解這些代碼。 – wrongusername 2011-01-10 05:21:26

回答

9

不,在您的示例中Ui::MainWindow是與全局名稱空間中定義的MainWindow類不同的類。

看哪:

namespace Ui { 
    class MainWindow; 
} 

class MainWindow 
{ 

}; 

int main() 
{ 
    Ui::MainWindow mw; // fails due to incomplete type 
} 

此代碼不能編譯,因爲Ui::MainWindow是一個不完整的類型。

很可能,Qt代碼只是使用前向聲明。您可以在名稱空間中轉發聲明該類,但是您仍然必須實際在相同的名稱空間中實現該類,否則它不是同一個類。

1

這兩個類是不同的。你所說的不是Qt,而是使用Designer來創建UI對象的結果。 Qt正確地做到了這一點,因爲他們試圖將生成的代碼與可能添加爲邏輯的任何東西分開,例如信號處理函數等。否則,他們必須能夠執行以下三件事之一:

1)嘗試說出設計師需要修改的內容與用戶不想要的內容之間的區別......以某種神祕的方式解決衝突,他們必須任意提出。

2)簡單地覆蓋任何用戶的變化。

3)如果用戶還沒有刪除它或其他東西,請不要更改文件。

首先是一大堆工作,不管開發人員選擇什麼,某個人在某個地方會感到不便。當然,第二種選擇會讓人不高興,因爲他們編寫的所有插槽代碼都會隨着用戶界面的每次更改而被破壞,幾乎所有的時間都會非常不方便。第三種方式由於多種原因並不方便。

因此,他們所做的是將由Designer生成的UI對象的一部分與由開發人員/用戶編寫的部分分開。這允許他們簡單地銷燬對某些定義明確的區域的更改,同時讓開發人員添加他們需要的行爲,而不必繼續添加它。

這不是你通常在常規程序設計中做的事情。這樣做是爲了解決與自動生成的代碼有關的一個相當具體的問題。這是一個相當深思熟慮的方法IMNSHO。

0

一般來說,uic使頭部看起來像這樣:

 class Ui_MainWindow 
     { 
     // auto-generated stuff 
     }; 

     namespace Ui { 
      class MainWindow: public Ui_MainWindow {}; 
     } 

這允許您使用MainWindow作爲類的名稱,並且還叫自動生成的UI類MainWindow。請注意,Ui::MainWindow是完整的類定義,而不是前向聲明。