• 23575阅读
  • 19回复

请问关于setAttribute(Qt::WA_DeleteOnClose)的用法 [复制链接]

上一主题 下一主题
离线liujianboy
 
只看楼主 倒序阅读 楼主  发表于: 2007-08-31
— 本帖被 XChinux 执行加亮操作(2007-08-31) —
  1. #include <QtGui>
  2. class Dialog:public QDialog
  3. {
  4. public:
  5.    
  6.     Dialog(QWidget *parent = 0):QDialog(parent)
  7.     {
  8.         this->setAttribute(Qt::WA_DeleteOnClose);
  9.         this->setFixedSize(100,100);
  10.     }
  11. };
  12. int main(int argc, char **argv)
  13. {
  14.     QApplication app(argc, argv);
  15.     Dialog index;
  16.     index.show();
  17.     return app.exec();
  18. }


该程序运行会在退出时产生内存读取错误。按照我的理解是setAttribute(Qt::WA_DeleteOnClose);导致两次delete同一块内存。但是我实际开发的程序本身是多页面的,需要关闭每个页面时释放窗口资源,如果没有setAttribute(Qt::WA_DeleteOnClose),close的时候仅仅是hide,资源并没有释放,请问应该怎么做才是正确的?
[ 此贴被XChinux在2007-08-31 13:20重新编辑 ]
离线fanbinnet

只看该作者 1楼 发表于: 2007-08-31
顶楼主
离线XChinux

只看该作者 2楼 发表于: 2007-08-31
楼主帖 出来的代码不会导致错误的吧??
我这里没遇到过出问题的。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线liujianboy
只看该作者 3楼 发表于: 2007-08-31
的确是出问题,就是在关闭的时候。

我用4.3.1mingw版编译运行结果如下图,是在退出的时候。而且发现另一个问题,如果写成index.exec(),程序无法关闭,进程仍然在后台。
离线XChinux

只看该作者 4楼 发表于: 2007-08-31
作为程序的主窗体,推荐使用QMainWindow,作为对话框才使用QDialog
MainWindow使用show(),对话框使用exec()
如果界面即可能在做独立窗体使用,又可能嵌入到其它界面中,就用QWidget
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线liujianboy
只看该作者 5楼 发表于: 2007-08-31
又研究了一下,如果该属性设置于第一个主窗体中就会出问题,其余不会。
离线liujianboy
只看该作者 6楼 发表于: 2007-08-31
引用第4楼XChinux于2007-08-31 13:50发表的  :
作为程序的主窗体,推荐使用QMainWindow,作为对话框才使用QDialog
MainWindow使用show(),对话框使用exec()
如果界面即可能在做独立窗体使用,又可能嵌入到其它界面中,就用QWidget



但是我并不需要QMainWindow的任何组件啊
离线XChinux

只看该作者 7楼 发表于: 2007-08-31
那就用exec()啊,为啥要用show()
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线liujianboy
只看该作者 8楼 发表于: 2007-08-31
引用第7楼XChinux于2007-08-31 13:56发表的  :
那就用exec()啊,为啥要用show()


啥意思,没看懂。

我是说没必要用QMainWindow,QDialog就够了
离线boen
只看该作者 9楼 发表于: 2009-12-09
Dialog *index;
    index->show();
离线sbtree
只看该作者 10楼 发表于: 2009-12-09
在vista+qt4.5.2+vc++2008下测试,的确存在问题,这个问题值得引起注意!
windows 7 + VC++2008 + Qt4.5.2
离线sbtree
只看该作者 11楼 发表于: 2009-12-09
针对楼主的要求,建议采用工厂设计模式
windows 7 + VC++2008 + Qt4.5.2
离线senfrans

只看该作者 12楼 发表于: 2010-03-16
针对继承于QWIDGET的类 一般是不在类类型内部设置该属性  
当声明为类对象指针时,new之后设置该属性,再show。退出时将自动回收。

如果在类类型构造函数设置该属性,声明指针对象,并new,退出后不会出错,但是如果是定义了一个对象,退出时就会报错。
离线pywepe
只看该作者 13楼 发表于: 2010-03-31
我也遇到这样的问题
离线wato
只看该作者 14楼 发表于: 2010-03-31

Dialog *index = new Dialog;
    index->show();
离线xiaoxianlg
只看该作者 15楼 发表于: 2012-06-01
C++中生成对象有两种方法,一种是直接用类对象(在内存的stack中),另一种是声明类指针然后new一下(在内存的heap中)。
对于前者,在作用范围结束时系统会回收资源。。。对于后者需要程序员手动回收。

所有,你生成对象时应该Dialog *index = new Dialog;
    index->show();这样就不会有问题了。

http://www.qtcn.org/bbs/read-htm-tid-21725.html
也可以参考上面这个网址。
离线xiaoxianlg
只看该作者 16楼 发表于: 2012-06-01
离线netlove

只看该作者 17楼 发表于: 2012-07-20
这么久的问题,楼主又没申请动态内存,这样使用肯定会出问题了
离线weiweiqiao

只看该作者 18楼 发表于: 2014-04-11
你在main方法中是生成对象(并未new生成实例),这种方法在退出main方法会自动回收资源,你再调用attribue(Qt::WA_DeleteOnClose)会导致Qt程序对已不属于他的资源进行delete,当然会出错。但是如果你用new的方法生成实例,实例会在退出main方法继续占用资源,所以你调用Qt::WA_DeleteOnClose删除的是仍被Qt使用的资源,故不会报错。
Jobs Insanely Great.
离线abcdlcq

只看该作者 19楼 发表于: 2014-04-17
这个就好像定义的局部变量还用‘delete &变量’ 类似
快速回复
限100 字节
 
上一个 下一个