Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/139.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从关闭时的子窗口中删除窗口句柄的内存_C++_Qt_Pointers_Delete Operator - Fatal编程技术网

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;
  • Class
    main窗口
    打开
    second\u窗口
  • second_窗口中
    i catch
    eventClose()
    在那里我想
    删除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。很抱歉给你带来了困惑。