找回密码
 FreeOZ用户注册
楼主: 四香油饼
打印 上一主题 下一主题

[菜鸟学堂] qt学习笔记

[复制链接]
91#
发表于 28-2-2009 21:32:41 | 只看该作者

回复 #90 GPS 的帖子

QT是采用很有特色的链式父子内存管理,每个对象都有个parent, 只要指定了parent的对象就不用担心内存的释放问题了,只要parent释放了会自动递归地释放它的所有子孙对象。
回复  

使用道具 举报

92#
发表于 28-2-2009 23:43:41 | 只看该作者
例子,
class A : public QDialog
{
      int *a ;
     A() { a = new int[100];}
}

Q1: A是QObject的子类,所以A一定可以被释放?
还是必须是调用A(parent) 或者 parent.addWidget(A的实例)来设定A的parent呢?
Q2:只要A被释放, a 就一定被释放?
回复  

使用道具 举报

93#
发表于 28-2-2009 23:47:05 | 只看该作者
回复  

使用道具 举报

94#
发表于 1-3-2009 00:05:12 | 只看该作者
我怎么觉得Q1已经说清楚了 -
A和他的parent 都必须是QObject, 那么A(如果是用new 来分配的),就会在parent被释放的时候释放。

Q2我还是不清楚, 当A被释放的时候,他里面用new 分配的不在QObject tree上的int  *a 应该在什么时候释放? 因为, 类A没有destructor, 因该在哪里释放合适?

coredump再讲详细点吧,谢谢阿。
回复  

使用道具 举报

95#
发表于 1-3-2009 00:23:56 | 只看该作者

回复 #94 GPS 的帖子

Q1:A能不能被正确释放要看怎么用,光看类声明/定义没用。
         比如:A* pA = new A();  这样的代码是不可能被自动释放的,因为它不属于任何一个对象树,或者说它是一个独立对象树的根,你要手工管理它的内存分配。 而A* pA = new A(parent); 这里parent是另一个QObject对象,则pA指向的对象属于parent对象树中的一个节点,被parent自动管理,parent释放时,pA指向的对象也自动释放,无需手工delete。

Q2:这是对C++基本概念理解有误,除非是另一种语言,否则A里面的数据成员a是永远不会被释放的。管理这里的a应该采用C++的RAII风格:在构造函数中申请资源,在析构函数中释放资源。 QT的对象管理和这个是完全不同的两回事。
回复  

使用道具 举报

96#
发表于 1-3-2009 01:19:56 | 只看该作者
谢谢coredump,Q1已经清楚了。
Q2的话,是不是我要在类A中加个~A(){ delete []a;} ?

评分

参与人数 1威望 +30 收起 理由
coredump + 30

查看全部评分

回复  

使用道具 举报

97#
发表于 1-3-2009 09:45:18 | 只看该作者
其实就是QT GUI类可以不用delete, 其他的new的都要delete, 所以Q2要写destructor里面的delete.
回复  

使用道具 举报

98#
发表于 1-3-2009 22:46:08 | 只看该作者
Thank you for all comments.

I understand as long as the QObjects are in the tree, they can be automatically released. If they are not in the tree, even if they are QObjects , they won't be released automatically.
回复  

使用道具 举报

99#
 楼主| 发表于 2-3-2009 21:41:51 | 只看该作者
我这两天觉得还需要再学习学习,打好基础,正在看官方的那个qt编程指南,对于怎么用designer,还是比较晕阿
回复  

使用道具 举报

100#
发表于 3-3-2009 21:42:41 | 只看该作者
QT念起来叫Qute. 希望我也能加入你们的学习小组。
回复  

使用道具 举报

101#
发表于 3-3-2009 21:57:47 | 只看该作者
welcome

We are all Qute people
回复  

使用道具 举报

102#
发表于 3-3-2009 22:10:56 | 只看该作者
http://freshmeat.net/browse/871/    QT的开源例子。

评分

参与人数 1威望 +30 收起 理由
coredump + 30 谢谢分享!

查看全部评分

回复  

使用道具 举报

103#
发表于 4-3-2009 19:24:25 | 只看该作者
没什么,好的东西大家分享嘛。当然老公和老婆,还有隐私除外。尽管,以上这三样东西,其实我们也没能力以保护其以独占方式运行。老婆,老公很多人都很清楚,但是隐私是啥玩意。大概很多人不是很了解,或者说他们不愿意了解。
http://www.youtube.com/user/QtStudios
我只用过3.0的版本。4.0的版本只写过小小程序。我发现qt3.0有个bug.还没来得及证实是否是Bug,QT就宣布告别3.0,迈向4.0了。现在连我自己都不记得了。而且本来也是商业版本cracked的,所以就更不好意思提了。也不知道是因为别人给crack坏了。还是本来就是这样的。
回复  

使用道具 举报

104#
发表于 4-3-2009 21:39:38 | 只看该作者

回复 #103 123ak 的帖子

现在不用不好意思了,都LGPL了,随便玩
回复  

使用道具 举报

105#
发表于 6-3-2009 00:37:35 | 只看该作者
我不是很随便的人,但是随便起来至少也还是人。呵呵。
回复  

使用道具 举报

106#
发表于 6-3-2009 12:17:32 | 只看该作者
唉,玩了6年C++,感觉还是很肤浅,本人对系统,平台机制方面很有兴趣,可惜没有机会 大部分时间都在写文档
回复  

使用道具 举报

107#
发表于 9-3-2009 23:47:17 | 只看该作者
Qt4的数据库问题
以下理解对马?
1。 从db=QSqlDatabase::addDatabase(), db.setHostName, setDatabaseName, setUser & set Password 一直到db.open()是建立一个连接。
2. 这个连接是对某个数据库系统(比如,MYSQL,或者POSTGRESQL等等),中的某个数据库(比如,employee, 等等)的。
3。QSqlQuery qry(db), 是在这个db连接上建一个查询。
4。可不可以在一个连接上同时用几个查询,比如, qry1(db), qry2(db),qry3(db)? 还是要对没个查询都建立一个db连接?
5。在MYSQL中好像,qry.prepare 和qry.bindValue()不太好用,exec后,qry.executedQuery并没有打出正确的SQL语句。
6。关闭和释放资源,只要db.close()就可以了,还要用QSqlDatabase::removeDatabase马?
回复  

使用道具 举报

108#
发表于 10-3-2009 00:08:13 | 只看该作者
1。 从db=QSqlDatabase::addDatabase(), db.setHostName, setDatabaseName, setUser & set Password 一直到db.open()是建立一个连接。
---对,
2. 这个连接是对某个数据库系统(比如,MYSQL,或者POSTGRESQL等等),中的某个数据库(比如,employee, 等等)的。
---对。
3。QSqlQuery qry(db), 是在这个db连接上建一个查询。
---是建立了一个可用来在这个db上进行查询的查询对象。等等哦运行exec()是才是真正查询。
4。可不可以在一个连接上同时用几个查询,比如, qry1(db), qry2(db),qry3(db)? 还是要对没个查询都建立一个db连接?
---当然可以。
5。在MYSQL中好像,qry.prepare 和qry.bindValue()不太好用,exec后,qry.executedQuery并没有打出正确的SQL语句。
---exec()的返回值检查了吗?exec()成功执行了吗?
6。关闭和释放资源,只要db.close()就可以了,还要用QSqlDatabase::removeDatabase马?
---removeDatabase()隐含db.close()。addDatabase(), removeDatabase()都是静态函数,维护一个全局的命名的数据库连接表。

建议具体API还是多看看QT自带的reference,都说的非常清晰,再结合自己的例子,这些问题就不用劳神问了,自己发现的答案往往记忆效果要远远好于别人告诉的。而且QT的文档质量是非常棒的,API也是非常多的,要是每个API都这样问问,那是没有穷尽的
回复  

使用道具 举报

109#
发表于 10-3-2009 17:22:24 | 只看该作者
谢谢coredump.
我是在看文档和写code,有些地方不太确认,所以想问一下。
我看看每次问的问题,回答的都有不同,可见每个人的理解都有可能不太一致,一比较了,更容易增加自己的理解。呵呵。不好意思。
回复  

使用道具 举报

110#
发表于 18-3-2009 03:52:50 | 只看该作者
讨论很激烈噻

但是lz  你打算用qt写 windows 下的程序吗?
回复  

使用道具 举报

111#
发表于 18-3-2009 23:32:25 | 只看该作者
再问个Qt内存问题。

1 QMainWindow *mw= new QMainWindow(this);
2 QForm *f1 = new QForm();
3 mw->addCentralWidget( f1);                // f1的parent变成mw
4 QForm *f2= new QForm();
5 mw->addCentralWidget(f2);               // f2 的parent变成mw, 那么f1呢?

如果f1的parent 还是mw,那么
   1。 f1 会在内存中继续存在,即使我用不到。
   2。 f1会在mw消失时自动消失。
            3.       我是否应该在第5行前及时 delete mw->centralWidget(); 来节省内存。
如果f1的parent 没有了,那么
   我必须在第5行前  delete mw->centralWidget();

以上理解到底哪个对呢?
回复  

使用道具 举报

112#
发表于 18-3-2009 23:35:50 | 只看该作者
Qt(linux)下有什么好用的report engine推荐马? 可以用来生成报表的,最好是可以嵌入自己的app。最好免费了。
回复  

使用道具 举报

113#
发表于 19-3-2009 09:32:19 | 只看该作者
Java的report engine都可以在Linux下用
回复  

使用道具 举报

114#
发表于 19-3-2009 09:33:23 | 只看该作者
原帖由 GPS 于 18-3-2009 23:32 发表
再问个Qt内存问题。

1 QMainWindow *mw= new QMainWindow(this);
2 QForm *f1 = new QForm();
3 mw->addCentralWidget( f1);                // f1的parent变成mw
4 QForm *f2= new QForm();
5 mw- ...


不是Parent-child关系,是parent-children关系
回复  

使用道具 举报

115#
 楼主| 发表于 19-3-2009 09:43:46 | 只看该作者
原帖由 hxuanyu 于 18-3-2009 04:52 发表
讨论很激烈噻

但是lz  你打算用qt写 windows 下的程序吗?


这个是问我吗?我想啊,不过我还没入门,一直还在门口徘徊
回复  

使用道具 举报

116#
发表于 19-3-2009 13:14:26 | 只看该作者
原帖由 coredump 于 19-3-2009 10:32 发表
Java的report engine都可以在Linux下用

有C++的马?
回复  

使用道具 举报

117#
发表于 19-3-2009 15:10:47 | 只看该作者

回复 #116 GPS 的帖子

不知道,我觉得现在这年月还用C++直接写report都是没事找事
回复  

使用道具 举报

118#
发表于 19-3-2009 20:27:59 | 只看该作者
那如果GUI和主要的程序都是用Qt和C++作(linux),那怎么用java作report呢?
回复  

使用道具 举报

119#
发表于 20-3-2009 10:03:22 | 只看该作者

回复 #118 GPS 的帖子

有什么奇怪,现在只要是上点规模的软件那个不是多语言开发,c、c++, java, web, python哪个模块适合用哪种技术就用那种技术好了。

至于C++的程序用Java report engine更不是问题了,一般report engine都是直接和数据库打交道,也不用和C++写的模块交互。如果需要交互的也有很多种方法, RPC, JNI, Socket。。。
回复  

使用道具 举报

120#
 楼主| 发表于 20-3-2009 12:28:06 | 只看该作者
弱智地问一句:REPORT是啥?
回复  

使用道具 举报

您需要登录后才可以回帖 登录 | FreeOZ用户注册

本版积分规则

小黑屋|手机版|Archiver|FreeOZ论坛

GMT+10, 7-9-2025 10:28 , Processed in 0.070888 second(s), 46 queries , Gzip On, Redis On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表