Qt 打开和关闭窗口/对话框的正确方法是什么?

Qt 打开和关闭窗口/对话框的正确方法是什么?,qt,memory-management,Qt,Memory Management,我正在尝试制定一个新的计划。工作流程如下所示: Login --> Dashboard (Window with menus) --> Module 1 --> Module 2 --> Module 3 --> Module X

我正在尝试制定一个新的计划。工作流程如下所示:

Login --> Dashboard (Window with menus) --> Module 1
                                        --> Module 2
                                        --> Module 3
                                        --> Module XXX
所以,要从登录打开仪表板(一个对话框),我使用

在Dashboard中,如果用户关闭窗口(通过单击“X”),我将使用这些代码重新打开登录

打开任务管理器后,我运行程序并监视内存使用情况。在从Login单击open Dashboard并关闭Dashboard返回Login之后,我注意到内存一直在增加大约500KB。只需打开和关闭窗口/对话框,内存使用量就可以从12MB增加到20MB


那么,我做错了什么?在我继续开发那些模块之前,我需要知道这一点,这些模块肯定会消耗我编程时更多的内存。提前感谢。

一个原因可能是您正在一次又一次地创建
登录
小部件,而没有删除它

我相信您的登录是一个
QWidget
仪表板是一个
QDialog
。不要使用
close()
,只需通过
hide()
setvisible(false)
隐藏登录小部件即可

仪表板的
closeEvent()
done(someIntValue)

在访问仪表板时,不是show()而是

如果
returnValue
someIntValue
show()
登录小部件

这样可以避免多次创建登录小部件。但是还有很多其他因素可能会影响内存的使用,只有仔细阅读整个代码才能发现这一点

编辑:

由于您的仪表板是一个QMainWindow,因此无法调用
done(someIntValue)
相反,尝试连接
已销毁(QObject*obj=0)
仪表板的信号以及相应的插槽
show()
您的登录。。当然,您应该在登录对话框中拥有仪表板的实例,并且应该在登录中建立上述信号和插槽之间的连接


希望有帮助。

登录是一个QDialog,仪表板是一个Qmain窗口如果我使用
hide()
setVisible(false)
,我需要将变量从一个类传递到另一个类,对吗?这在我的程序中不是很实用,因为在单击关闭窗口按钮返回登录之前,我可能会多次调用其他类。我知道我应该多次尝试避免创建任何小部件,但是如果我创建了一些已被破坏的小部件,在这种情况下,是否应该没有问题,我的小部件是否在关闭时释放了其使用过的内存?不,我想你误解了。您不必到处传递对象。您可以通过调用hide()隐藏登录对话框,因为您是从QDialog派生登录的。为了回答您的另一个问题,仅当您手动将对话框的属性设置为Login->setAttribute(Qt::WA_DeleteOnClose)时,对话框才会被删除;我认为使用
setAttribute(Qt::WA_DeleteOnClose)
是可行的。但是,您能举一个例子,说明当我在仪表板中时如何重新打开登录对话框(而不声明新对象)?我不能只
show()
将其返回,因为没有与之关联的对象。这就是为什么我必须创建一个新对象(结果增加了内存使用)
Dashboard *d = new Dashboard();
d->show(); 
close(); 
closeEvent(QCloseEvent *) 
{
    Login *login = new Login();
    login->show();
}
int returnValue = d->exec();