2011-01-10 83 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是完整的类定义,而不是前向声明。