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

QMouseEvent会不会内存泄露解决方案

2012-05-23 
QMouseEvent会不会内存泄露需求是这样的: 我在awidget里面接收了双击消息,然后我想在bwidget(awidget的父

QMouseEvent会不会内存泄露
需求是这样的: 我在awidget里面接收了双击消息,然后我想在bwidget(awidget的父窗口)处理这个双击消息,但是我要把事件的pos的值修改一下,这样我就必须新new一个QMouseEvent,问题是,谁来删除这个QMouseEvent,如果不删除,会不会内存泄露呢?


[解决办法]
http://blog.csdn.net/wangkuiyun/article/details/7412379
[解决办法]
这是一个很有趣的问题,以前我也遇到过,没有留意,因为当时感觉,QEvent 并不是继承与QObject 不会有Qt提供的委托模式释放关系。但是没有留意。
今天我做了个实验。代码很简单,我用QtCreator 创建了一个GUI工程,只改了cpp部分 如下:

C/C++ code
#include "MainWindow.h"#include "ui_MainWindow.h"#include <QEvent>#include <QDebug>class MyEvent : public QEvent {public:    MyEvent(Type type);    virtual ~MyEvent();};MyEvent::MyEvent(Type type) : QEvent(type) {}MyEvent::~MyEvent() { qDebug() << "delete here"; }MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);    QEvent* e = new MyEvent((QEvent::Type)8848);    qApp->postEvent(this, e);  // 1    delete e;                  // 2}MainWindow::~MainWindow(){    delete ui;}
[解决办法]
这要看你是使用postEvent还是sendEvent

对于postEvent(这相当于异步)你必须在堆中创建event,因为Qt会接管event,并主动释放对象。
对于sendEvent(这相当于同步)建议你在栈中创建event,因为Qt不负责释放对象。

相关文档,请参考QCoreApplication里的postEvent和sendEvent部分

热点排行