• 6125阅读
  • 4回复

[提问]关于qt自动回收的问题 [复制链接]

上一主题 下一主题
离线xiaomajia700
 
只看楼主 倒序阅读 楼主  发表于: 2012-03-01
我建了一个主窗口MainWindow::QMainWindow,
在MainWindow中定义了2个子窗口指针,
private:
     Widget1* a;
     Widget2* b;
Widget1和Widget2都继承自QWidget
在主窗口的构造函数中实例化,
MainWindow::MainWindow()
{
    a = new widget1(this);
    b = new widget2(this);
}
void MainWindow::show1()
{
    setCentralWidget(a);
}
void MainWindow::show2()
{
    setCentralWidget(b);
}
show1和show2都是槽,
执行的时候,是先show1()然后show2()再show1()
但是第二次进入show1()时报错,跟踪发现第二次进入show1()时a的指针为不可用,a的在show2()执行过程中是存在的,在show2()方法执行后,进入show1()的信号发出前被析构,我没有对a进行close的操作,貌似是qt将其当作垃圾自动回收了
我想实现的操作是,a显示时b隐藏,b显示时a隐藏,但a、b都不销毁,请问各路高手有没有什么好的方法解决......
离线rcyboom

只看该作者 1楼 发表于: 2012-03-01
qwidget有个属性可以设置的 Qt::WA_DeleteOnClose 使用setAttribute方法
另外 qmainwindow的setCentralWidget 方法中有说明:
Note: QMainWindow takes ownership of the widget pointer and deletes it at the appropriate time
说明QMainWindow 会删除这个窗口,简单的方法是随便弄个qframe作为中心窗口,两个窗体一起加入其中作为子控件,然后在你的槽函数里简单的hide和show即可;
或者直接在qframe上使用layout,然后采用add和remove均可。
离线xiaomajia700
只看该作者 2楼 发表于: 2012-03-01
第一行:感谢二楼!
第二行:非常感谢二楼!!
经过实验,用layout然后add和remove的话,第二次显示a时,b是会留在界面上的,而且是在a的上方,貌似这种方法不太好用
使用qframe或者qwidget做中心窗口然后把两个窗体加进去hide、show的方法可以很好的实现功能
最后:继续感谢二楼!
离线rcyboom

只看该作者 3楼 发表于: 2012-03-01
【第二次显示a时,b是会留在界面上的,而且是在a的上方,貌似这种方法不太好用】
当然你得在槽函数中同时负责显示一个,隐藏一个了。。。这个是不能偷懒的要么直接隐藏一个并显示另一个,要么使用layout的方法add一个并remove另一个,效果一样的。
离线fjcqv

只看该作者 4楼 发表于: 2012-03-01
为什么不用 QStackedWidget ?
还比较方便点,槽都提供好了。
快速回复
限100 字节
 
上一个 下一个