• 12538阅读
  • 14回复

uic为什么要生成的namespace Ui? [复制链接]

上一主题 下一主题
离线蛮蛮
 
只看楼主 倒序阅读 楼主  发表于: 2008-12-19
— 本帖被 XChinux 执行加亮操作(2008-12-19) —
请教了。
这个同名的类有什么用?在什么情况下有用?
蛮蛮工作室
离线蛮蛮
只看该作者 1楼 发表于: 2008-12-19
本来在
http://www.qtcn.org/bbs/read.php?fid=16&tid=14616&u=9811
问的,可那个版块似乎看的人少一些。一直没人回答,不利己在这提问。
版主海涵。
蛮蛮工作室
离线XChinux

只看该作者 2楼 发表于: 2008-12-19
防止命名冲突
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线蛮蛮
只看该作者 3楼 发表于: 2008-12-19
这里果然有效果。
可不可以说的详细点。我大概猜到了,但不知道具体是怎么回事。
蛮蛮工作室
离线XChinux

只看该作者 4楼 发表于: 2008-12-19
在designer将你设计的窗体命名A,则会在生成的ui_xxxx.h文件中有类:
Ui::A
如此你可以在你自己的类中使用它:
#include "ui_xxxx.h"
class MyA
{
.....
    Ui::A ui;
}

MyA::MyA()
{
    ui.setupUi(this);
}
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线蛮蛮
只看该作者 5楼 发表于: 2008-12-19
那跟 namespace Ui 有多大的关系?
好像即使没有 namspace Ui 下的那个类名与自定义的类同样的类,程序也能正常动作吧。
ui.setUi我也看了在它下面uic好像是把designer生成的ui文件的xml格式拿过来,生成对应的c++ code,但不知道为什么在ui_***这个类下面加上一个 namspace Ui有什么用,并且在这个命名空间下面有一个与自定义类同名的类。
似乎版主没看懂我问的问题,或者版主以为这个问题太简单,回答得我不知道从哪儿理解。
蛮蛮工作室
离线XChinux

只看该作者 6楼 发表于: 2008-12-19
真是无语,如果没有命名空间,你自己定义的类叫A,designer中设置的窗体的名字也叫A,那你能共同使用它们么?能编译得过去么?
结帖。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线蛮蛮
只看该作者 7楼 发表于: 2008-12-22
版主还是没了解我的意思,我并非是说不要命名空间,而是说为什么会有这个命名空间和它里面这个看起来并没有做什么动作的类。因为我试过,把uic生成的这个类注释掉以后,并没有什么不良影响。起码我没看见。
蛮蛮工作室
离线蛮蛮
只看该作者 8楼 发表于: 2008-12-23
顶一下
蛮蛮工作室
离线wd007

只看该作者 9楼 发表于: 2008-12-23
我明白你的意思,这个问题是这样的:
在Qt 4中,如果你使用Qt Designer 来制作界面,那么要把这个界面引入到你的工程中使用的话,可以有3种静态方式,以及1种动态方式。

你说的那个在名字空间中定义的类,就是为了方便你直接使用这个在Ui_xxx.h中生成的类,它相当于界面的实体类,这种方式称作直接使用;还有两种静态方法就是不直接使用该类,而是采用单继承或多继承的方式,自己生成新的界面的实体类。
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线蛮蛮
只看该作者 10楼 发表于: 2008-12-24
讲得比较深。。。
如果不生成命名空间下的那个类,怎么就不方便我直接使用ui_***.h类了?
可不可以详细介绍下四种不同方法,有相关文档吗?
这一点我还是没搞懂
蛮蛮工作室
离线wd007

只看该作者 11楼 发表于: 2008-12-24
直接使用方式例子:
QWidget* pWidget = new Qwidget;
Ui::xxxxForm ui;
ui.setupUi(pWidget);
pWidget->show();
其中,xxxxForm 就是在名字空间中生成的类,实际上,在Ui_xxxxForm.h中,可以看到,xxxxForm是单继承自Ui_xxxxForm这个界面原生实体类的,也就是moc已经为方便
大家使用而生成了一个派生类了,前面加上命名空间是为了更加明晰,且预防冲突。

单继承方式例子:
class CxxxxForm:public QWidget
{
        Q_OBJECT

        public:
                CxxxxForm(QWidget* = 0);

        private:
                Ui_xxxxForm ui;
};

其中,CxxxxForm就是你自己定义的类,它单继承自QWidget。但它有一个私有成员变量ui,它的类型就是在Ui_xxxxForm.h文件中生成的原生界面实体类。

多继承方式例子:(简略)
class CxxxxForm:public QWidget,public Ui_xxxxForm
{
      Q_OBJECT

        public:
                CxxxxForm(QWidget* = 0);
};

好了,我讲的比较明晰了吧
[ 此贴被wd007在2008-12-25 23:16重新编辑 ]
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
离线蛮蛮
只看该作者 12楼 发表于: 2008-12-25
已经比较清楚了。终于把这个问题搞清楚了。
蛮蛮工作室
离线earctan

只看该作者 13楼 发表于: 2008-12-25
顶一下。
wd007耐心细致讲得好
离线wd007

只看该作者 14楼 发表于: 2008-12-25
呵呵,互相帮助而已
欢迎访问我的博客,一起学习提高
http://blog.csdn.net/qter_wd007
快速回复
限100 字节
 
上一个 下一个