首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > QT开发 >

Qt多窗口的有关问题

2012-06-17 
Qt多窗口的问题我实现一个简单的QQ,双击好友图标出来一个聊天对话框,现在问题是怎么样实现同时打开几个聊

Qt多窗口的问题
我实现一个简单的QQ,双击好友图标出来一个聊天对话框,现在问题是怎么样实现同时打开几个聊天对话框?
我现在是这样做的:

C/C++ code
class BuddyGroupList{    //……    ChatDialog *aChat;    //……};// 这是一个slots,双击好友图标响执行它void BuddyGroupList::openChatDialog(){    aChat = new ChatDialog();    aChat->show();}

这样就只有一个指针,虽然每次双击都能弹出聊天窗口并显示,但每次双击都用new创建一个窗口,都占用了aChat这一个指针,那之前那些窗口不是没有指针指向它们了吗? 这样不是会引起内存泄漏吗?这些窗口都是独立的窗口,没有parent。
怎么样才能不引起内存泄漏呢?
还能用什么办法实现这个多窗口聊天功能呢?

[解决办法]
可以记录这个指针变量是有分配过 实例,有就先释放在new
if(beExist)
delete aChat;
beExist = true;
aChat = new ChatDialog();
aChat->show();


[解决办法]
。。。定义多个对话框指针,比如20个,超过20个就提示用户窗口过多。谁有三头六臂可以跟20个人同时聊天么!
[解决办法]
你看C++ GUI with QT4编程,中文版第56页,有类似于你的问题。
为了防止memory leaking,人家the solution is to set the Qt::WA_DeleteOnClose attribute in the constructor.

就是在对话框的构造函数中添加 setAttribute(Qt::WA_DeleteOnClose);

好了,给分吧
[解决办法]
只用一个ChatDialog *aChat;指向所有的聊天窗口这样肯定是不行的。
如果是我,我会这样写。
 
 class chat 封装一个聊天会话
 class ChatDialog 封装用于显示一个对话的聊天窗口
 每个chat保存一个指向ChatDialog的指针

 保存一个chat的链表。
 当结束和一个人的聊天时,删除一个chat,顺带删除这个chat带的ChatDialog(如果有)
[解决办法]
设置setAttribute(Qt::WA_DeleteOnClose);
然后每当创建一个aChat = new ChatDialog();就用QWidget::winId ()保存其WId,之后你
要使用窗口的时候直接 QWidget::find ( WId )返回窗口指针,即可使用
[解决办法]
探讨

只用一个ChatDialog *aChat;指向所有的聊天窗口这样肯定是不行的。
如果是我,我会这样写。

class chat 封装一个聊天会话
class ChatDialog 封装用于显示一个对话的聊天窗口
每个chat保存一个指向ChatDialog的指针

保存一个chat的链表。
当结束和一个人的聊天时,删除一个chat,顺带删除这个chat带的ChatD……

[解决办法]
探讨
引用:

只用一个ChatDialog *aChat;指向所有的聊天窗口这样肯定是不行的。
如果是我,我会这样写。

class chat 封装一个聊天会话
class ChatDialog 封装用于显示一个对话的聊天窗口
每个chat保存一个指向ChatDialog的指针

保存一个chat的链表。
当结束和一个人的聊天时,删除一个……

[解决办法]
用Qt::WA_DeleteOnClose true 是最简单的方法了。。
此外你还可以用 QList<ChatDialog *> List 来管理你的所有ChatDialog。这样,你可以在ChatDialog的构造函数中调用List.append(this)来向List添加本窗口,在析构函数中调用list.remove(this),从List中移除本窗口,从而很好的方便的灵活的管理你的窗口。。
此外你还可以用 QPointer<ChatDialog> point ,指针来接管你的ChatDialog * 指针,从而用
QList<QPointer<ChatDialog> >List来管理你的窗口,该方法更加强大,保证不会出现野指针问题。

热点排行