C++ 从关闭时的子窗口中删除窗口句柄的内存
让我看看我的配置:C++ 从关闭时的子窗口中删除窗口句柄的内存,c++,qt,pointers,delete-operator,C++,Qt,Pointers,Delete Operator,让我看看我的配置: mainwindow.h second_window.h 将指针保持在类方法中的second\u window(public:second\u window*h\u window;) Classmain窗口打开second\u窗口 在second_窗口中i catcheventClose() 在那里我想删除h_窗口 但我得到了一个访问错误,我认为窗口仍然打开,所以当我试图删除指针内存时,我得到了错误 什么时候应该删除此指针?如果为其设置父对象,则无需删除第二个窗口的对象:
mainwindow.h
second_window.h
second\u window
(public:second\u window*h\u window;
)main窗口
打开second\u窗口
second_窗口中
i catcheventClose()代码>
在那里我想删除h_窗口代码>
但我得到了一个访问错误,我认为窗口仍然打开,所以当我试图删除指针内存时,我得到了错误
什么时候应该删除此指针?如果为其设置父对象,则无需删除第二个窗口的对象:
h_window = new second_window(this); // in the constructor of mainwindow
当一个对象被删除并且有子对象时,析构函数会自动删除每个子对象。因此,在删除父对象时,子对象会自动删除
建议在堆上创建子对象并立即将其设置为父对象。如果不立即创建父对象,可以使用setParent()
函数显式创建父对象
如果出于某种原因,您不希望对象具有父对象,您也可以使用QSharedPointer
来管理对象的生存期。如果为其设置父对象,则无需删除第二个\u窗口的对象
:
h_window = new second_window(this); // in the constructor of mainwindow
当一个对象被删除并且有子对象时,析构函数会自动删除每个子对象。因此,在删除父对象时,子对象会自动删除
建议在堆上创建子对象并立即将其设置为父对象。如果不立即创建父对象,可以使用setParent()
函数显式创建父对象
如果出于某种原因您不希望对象具有父对象,您也可以使用QSharedPointer
来管理对象的生存期。如果两个窗口都是独立的,因此没有父对象,那么解决方法是使用QPointer和setAttribute(Qt::WA_DeleteOnClose)
class主窗口:公共QWidget{
公众:
~main window(){
删除h_窗口;//如果h_窗口不是0(即尚未关闭),则删除h_窗口
}
void showSecondWindow(){
如果(!h_窗口){
h_窗口=新的第二个_窗口();
}
h_窗口->显示();
h_窗口->激活窗口();
}
私人:
QPointer h_window;//删除第二个h_window时,h_window将自动变为0。
}
类第二个窗口:公共QWidget{
公众:
第二个窗口(){
setAttribute(Qt::WA_DeleteOnClose);//当窗口关闭时自动删除自身
}
}
如果两个窗口都是独立的,因此没有父窗口,那么解决方法是使用QPointer和setAttribute(Qt::WA_DeleteOnClose)
class主窗口:公共QWidget{
公众:
~main window(){
删除h_窗口;//如果h_窗口不是0(即尚未关闭),则删除h_窗口
}
void showSecondWindow(){
如果(!h_窗口){
h_窗口=新的第二个_窗口();
}
h_窗口->显示();
h_窗口->激活窗口();
}
私人:
QPointer h_window;//删除第二个h_window时,h_window将自动变为0。
}
类第二个窗口:公共QWidget{
公众:
第二个窗口(){
setAttribute(Qt::WA_DeleteOnClose);//当窗口关闭时自动删除自身
}
}
请发布说明问题的示例代码。请发布说明问题的示例代码。不要忘记在子窗口小部件上设置Qt::Window
标志,否则它将成为子窗口小部件,而不是顶级窗口。@KubaOber,不知道Qt::Window可以“提取”它本身来自父QWidget:),但在MS Windows上使用父第二个_窗口进行测试后,我发现问题:1。第二个_窗口将始终位于主窗口的前面,即使主窗口具有焦点。2.第二个窗口未显示在Windows任务栏上。虽然这可以通过使用WS_EX_APPWINDOW设置WindowLong来解决,但还有其他问题:a)第二个_窗口没有出现在Alt+Tab窗口列表中。b) 最小化主窗口将使第二个窗口从任务栏中消失。c) 单击任务栏上的主窗口或第二个窗口将它们放在一起。我想Alt+Tab用于切换应用程序,而不是窗口。这两个窗口都属于同一个应用程序,因此我认为您描述的行为是正确的。就像你们有一个对话框一样。@KubaOber,IMHO,Alt+Tab是用来切换任务栏上出现的窗口的。例如,所有Windows资源管理器窗口都显示在Alt+Tab窗口列表中,但只有一个Explorer.exe正在运行。@fxam OK,显然我不太使用Windows。很抱歉造成混淆。请不要忘记在子窗口小部件上设置Qt::Window
标志,否则它将成为子窗口小部件,而不是顶级窗口。@KubaOber,从来不知道Qt::Window可以从父窗口QWidget:“提取”自身。)但在MS Windows上使用父窗口第二个_窗口进行测试后,我发现问题:1。第二个_窗口将始终位于主窗口的前面,即使主窗口具有焦点。2.第二个窗口未显示在Windows任务栏上。虽然这可以通过使用WS_EX_APPWINDOW设置WindowLong来解决,但还有其他问题:a)第二个_窗口没有出现在Alt+Tab窗口列表中。b) 最小化主窗口将使第二个窗口从任务栏中消失。c) 单击任务栏上的主窗口或第二个窗口将它们放在一起。我想Alt+Tab用于切换应用程序,而不是窗口。这两个窗口都属于同一个应用程序,因此我认为您描述的行为是正确的。就像你们有一个对话框一样。@KubaOber,IMHO,Alt+Tab是用来切换任务栏上出现的窗口的。例如,所有Windows资源管理器窗口都显示在Alt+Tab窗口列表中,但只有一个Explorer.exe正在运行。@fxam OK,显然我不太使用Windows。很抱歉给你带来了困惑。