Qt Widget和Dialog区别和使用,QWidget一闪而过
2015-03-17 11:12
1446 查看
在开发过程发现子窗口的析构函数没有执行,后来查找发现,在创建对象的时候没有传递this指针
例如Model *model = new Model();和Model *model = new Model(this);this指针没有传递,因此无法调用子对象的析构函数。
当子对象定义为指针,会出现因为没有被释放而无法被释放的现象,当关闭子窗体时不会调用析构函数,只有关闭父窗体时,才会调用子窗体的析构函数,可以设置this->setAttribute(Qt::WA_DeleteOnClose)来调用父类析构
回到QWidget和QDialog的问题上,当我把子对象QWidget定义为指针时,因为父对象被关闭,导致子对象的指针无法被释放,析构函数不能被执行。而把QWidget子对象定义为局部变量的时候,窗口却一闪而过,因为子对象作为布局变量,很快就是系统释放了,所以窗口一闪而过。
当子窗口继承QDialog的时候,因为QDialog起了一个事件循环exec,不会出现窗口一闪而过的现象。
因此,当子窗口继承QWidget的时候,一定要注意指针的传递,如果父对象被关闭,可以通过设置子窗口this->setAttribute(Qt::WA_DeleteOnClose)来调用父类析构函数。
例如Model *model = new Model();和Model *model = new Model(this);this指针没有传递,因此无法调用子对象的析构函数。
当子对象定义为指针,会出现因为没有被释放而无法被释放的现象,当关闭子窗体时不会调用析构函数,只有关闭父窗体时,才会调用子窗体的析构函数,可以设置this->setAttribute(Qt::WA_DeleteOnClose)来调用父类析构
回到QWidget和QDialog的问题上,当我把子对象QWidget定义为指针时,因为父对象被关闭,导致子对象的指针无法被释放,析构函数不能被执行。而把QWidget子对象定义为局部变量的时候,窗口却一闪而过,因为子对象作为布局变量,很快就是系统释放了,所以窗口一闪而过。
当子窗口继承QDialog的时候,因为QDialog起了一个事件循环exec,不会出现窗口一闪而过的现象。
因此,当子窗口继承QWidget的时候,一定要注意指针的传递,如果父对象被关闭,可以通过设置子窗口this->setAttribute(Qt::WA_DeleteOnClose)来调用父类析构函数。
相关文章推荐
- QT中 widget window dialog 的区别
- Qt - QDialog,QWidget实现模态及非模态(模态Widget不能有父窗口,如果设置无边框就不能阻塞父窗口,但是可以强行设置指定Qt::Dialog,还可以setAttribute(Qt::WA_ShowModal),很多讲究)good
- (转)2.6 Qt提供的控件和对话框类(Built-in Widget and Dialog Classes)
- Qt中设置widget背景颜色/图片的注意事项(使用样式表 setStyleSheet())
- Qt QColorDialog QErrorMessage QFileDialog QFontDialog QProgressDialog 等对话框的使用测试
- Qt中设置widget背景颜色/图片的注意事项(使用样式表 setStyleSheet())
- QT中QWidget、QDialog及QMainWindow的区别
- 2.6 Qt提供的控件和对话框类(Built-in Widget and Dialog Classes)
- Qt中QWidget、QMainWindow、QDialog的区别
- QT DLL的使用问题---QWidget: Must construct a QApplication before a QPaintDevice
- qt4.3.3使用TabWidget关闭选项卡的想法
- QT中QWidget、QDialog及QMainWindow的区别
- QWidget体系与QGraphicsWidget体系之间的区别
- C#中方法Show.和ShowDialog的使用区别
- Qt中设置widget背景颜色/图片的注意事项(使用样式表 setStyleSheet())
- QWidget体系与QGraphicsWidget体系之间的区别(转)
- C#中方法Show.和ShowDialog的使用区别
- Qt中设置widget背景颜色/图片的注意事项(使用样式表 setStyleSheet())
- C#中方法Show和ShowDialog的使用区别
- QT中QTableWidget的使用