• 13954阅读
  • 14回复

[提问]QT界面自动生成类构造函数的初始化疑问 [复制链接]

上一主题 下一主题
离线楚来兴
 
只看楼主 正序阅读 楼主  发表于: 2013-09-02
界面对应的头文件中,界面为Ui_ConnectionPage,自动生成的类名为ConnectionPage
在Ui_connectionPage对应的头文件中有如下代码:
namespace Ui {  
class ConnectionPage: public Ui_ConnectionPage {};
} 是否表面前面继承了后者?


在ConnectionPage的头文件类申明中有
class ConnectionPage : public QWidget
{
private:
Ui::ConnectionPage *ui;
}
应该就是在子类中又申明了父类的对象。


ConnectionPage::ConnectionPage(QWidget *parent) :    
          QWidget(parent),  
          ui(new Ui::ConnectionPage)
{
    ui->setupUi(this);
}
请问构造函数中ui(new Ui::ConnectionPage)这是什么用法呀?不像常规的父类构造函数也不像ui的定义

离线楚来兴
只看该作者 14楼 发表于: 2013-09-03
回 12楼(bingyifeng) 的帖子
多谢大家的讲解,我认真看了下相关的知识,这个应该算是一个前置申明,因为头文件里面没有包含界面对应头文件,而是放在了源文件,不仅仅是冲突的原因,因为使用了Ui::,所以冲突应该是不会发生的
离线楚来兴
只看该作者 13楼 发表于: 2013-09-03
引用第11楼dbzhang800于2013-09-03 11:48发表的  :
应该抽出至少1个月时间,把C++基础知识过一遍。“定义”,“声明” 这些概念搞不清是很要命的


这个问题到此结束吧,这是一个命名空间内类的前置声明。跟普通的类的前置申明有点不一样。
如果是定义,也就是在命名空间内只进行成员的声明,而将其定义放在命名空间外进行,即在命名空间的定义之外,定义命名空间的成
员(外部定义),则在定义时应该加上命名空间和限定符,希望后面的人不要犯这个简单的错误。






离线bingyifeng

只看该作者 12楼 发表于: 2013-09-03
回 8楼(楚来兴) 的帖子
1.所谓的组合方式是指:把UI当成成员变量来使用
不管是指针还是直接是变量
class ConnectionPage : public QWidget{
  ......
private:
Ui::ConnectionPage *ui;(这种情况在实例化ConnectionPage 的时候像你1楼里面之所以再在构造函数中new一下,就是因为是指针)


private:
Ui::ConnectionPage ui;(这种情况在实例化ConnectionPage 的时候,就会分配 ui的内存,所以不需要再在构造函数中new一下)
}

2.所谓的多成继承是指这样的。

class ConnectionPage : public QWidget,public Ui::ConnectionPage
{

}


3.>>如果是使用命名空间的话,应该是using namespace ui 才对
不一定非要这样,比如std 这个namespace。
可以using namespace std,然后再直接使用cout
也可以std::cout ,道理是一样的。

4.>>但是我不清楚namespace Ui {class ConnectionPage;}是起什么作用
不加这个namespace的话,在当前可见的域中就会有两个class ConnectionPage,你想想这样会出现什么问题?

5.抽时间按11楼 dbzhang800 的要求复习下吧 :)
<span style="color:blue ">淘宝,绿石斋</span> <a href="http://shop33295817.taobao.com“> <span style="color:blue ">各种水晶饰品,手链,项链 </span></a>
离线dbzhang800

只看该作者 11楼 发表于: 2013-09-03
引用第10楼楚来兴于2013-09-03 11:32发表的  :
百度了好久没找到答案,在QT版问C++的内容,请见谅。

应该抽出至少1个月时间,把C++基础知识过一遍。“定义”,“声明” 这些概念搞不清是很要命的
离线楚来兴
只看该作者 10楼 发表于: 2013-09-03
引用第9楼dbzhang800于2013-09-03 10:04发表的  :
两种情况下这句话都起作用。
当然,如果你代码中是用的 Ui_ConnectionPage 而不是 Ui::ConnectionPage 的话,两种情况下这句话都不起作用。
多补补C++的基础知识吧,这些东西和Qt没什么关系,而且在Qt的资料中你也找不到答案。

多谢版主,终于知道错误发生在命名空间的理解上了,还有一点查了下资料不太明白,请版主指导。
private:Ui::ConnectionPage *ui; 的使用表明是使用了命名空间里面的ConnectionPage, 而ui文件对应的类名是
ui_ConnectionPage,所以 namespace Ui{class ConnectionPage: public Ui_ConnectionPage {};}肯定起作用了;
但是我不清楚namespace Ui {class ConnectionPage;}是起什么作用,是在命名空间中添加一个成员吗?那这不算成员冲突吗?如果是使用命名空间的话,应该是using namespace ui 才对,而且使用的时候也加了限定符,Ui::,所以好像没有这个必要,百度了好久没找到答案,在QT版问C++的内容,请见谅。
离线dbzhang800

只看该作者 9楼 发表于: 2013-09-03
两种情况下这句话都起作用。

当然,如果你代码中是用的 Ui_ConnectionPage 而不是 Ui::ConnectionPage 的话,两种情况下这句话都不起作用。

多补补C++的基础知识吧,这些东西和Qt没什么关系,而且在Qt的资料中你也找不到答案。
离线楚来兴
只看该作者 8楼 发表于: 2013-09-03
回 5楼(bingyifeng) 的帖子
谢谢,不知道这样理解是否正确,在QT creator中创建UI提供了两种方式,一种是自动生成界面类头文件和源文件的,一种是只有UI文件,构建后也只得到UI文件对应的头文件。
前一种方式采用了类的组合,让UI成为一个类成员,所以那句继承语句不起作用;
后一种方式教程C++GUI Qt4教授大家使用的是双继承的方式,这时候那句继承才起到作用。

还是我的理解有问题,namespace Ui {   class ConnectionPage: public Ui_ConnectionPage {};} 是用在别的地方?望指教
离线楚来兴
只看该作者 7楼 发表于: 2013-09-03
引用第6楼kimtaikee于2013-09-02 23:17发表的  :
LZ , 你还是抱着这本书安心的看吧http://www.amazon.cn/C-%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1%E8%AF%AD%E8%A8%80-%E6%96%AF%E7%89%B9%E5%8A%B3%E6%96%BD%E7%89%B9%E9%B2%81%E6%99%AE/dp/B004HKJHHQ/ref=sr_1_1?ie=UTF8&qid=1378134572&sr=8-1&keywords=the+c%2B%2B+programming+language

呵呵,确实是c++太烂,时间不等人,没办法,只能QT,c++学习交替进行
离线kimtaikee

只看该作者 6楼 发表于: 2013-09-02

离线bingyifeng

只看该作者 5楼 发表于: 2013-09-02
不算,注意看她们的namespace 是不一样的。
<span style="color:blue ">淘宝,绿石斋</span> <a href="http://shop33295817.taobao.com“> <span style="color:blue ">各种水晶饰品,手链,项链 </span></a>
离线楚来兴
只看该作者 4楼 发表于: 2013-09-02
引用第3楼dbzhang800于2013-09-02 19:14发表的  :
这是C++的基础语法,可以搜索 “构造函数初始化列表” 获取更多信息

谢谢版主提醒。 请问下面这样申明一句是表明了继承关系吗?
在Ui_connectionPage对应的头文件中有如下代码:
namespace Ui {   class ConnectionPage: public Ui_ConnectionPage {};}
后面又有
class ConnectionPage : public QWidget
这样算双继承了吗?


离线dbzhang800

只看该作者 3楼 发表于: 2013-09-02
这是C++的基础语法,可以搜索 “构造函数初始化列表” 获取更多信息
离线楚来兴
只看该作者 2楼 发表于: 2013-09-02
回 1楼(kimtaikee) 的帖子
谢谢,再请教一下,我试了下,确实是这样得功能,把那句程序修改下放到构造函数括号内,是一样的效果。
可为什么要这样表示,有什么特别的规则吗
离线kimtaikee

只看该作者 1楼 发表于: 2013-09-02
初始化成员指针,new一个对象然后赋值给ui

快速回复
限100 字节
 
上一个 下一个