如果一个QPushButton不是QDialog的子窗体,该怎么删除?

时间:2022-11-01 14:35:54
              对于一个对话框QDialog,我需要有个按钮QPushButton,这个按钮显示一个图片,这个按钮的一个很重要的功能是他游离于对话框之外,即用户可以拖动这个按钮(图片)去显示器的任何位置
             
              然后,我在对话框的构造函数里
         
buttons = new QPushButton(tr("图片"))

              这个buttons没有用this声明他的父对象,也没用过布局管理器安装到对话框上(因为他需要游离在对话框外),然后问题来了,程序运行后当我关闭对话框的时候,那个按钮并没有消失,需要手动关闭,我开始以为这是因为buttons不是对话框的子对象,所以对话框析构的时候没有删除掉他,于是我在对话框的析构函数里加上
          
delete buttons

            我以为这样关闭对话框的时候就会删除掉这个按钮,但实际是关闭对话框后那个按钮还在这边,必须手动关闭,我先回问下这是什么情况,为什么在析构函数里delete了,这个按钮还在这里

8 个解决方案

#1


因为他需要游离在对话框外???

1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????

#2


引用 1 楼 C_522 的回复:
因为他需要游离在对话框外???

1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????

我试了一下,我在 QDialog的析构函数里加了一句
qDebug()<<"123";

我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。 如果一个QPushButton不是QDialog的子窗体,该怎么删除?

#3


引用 2 楼 qazaq408 的回复:
Quote: 引用 1 楼 C_522 的回复:

因为他需要游离在对话框外???

1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????

我试了一下,我在 QDialog的析构函数里加了一句
qDebug()<<"123";

我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。 如果一个QPushButton不是QDialog的子窗体,该怎么删除?



this->close();
一般是隐藏窗口,而不是销毁窗口。

#4


引用 3 楼 C_522 的回复:
Quote: 引用 2 楼 qazaq408 的回复:

Quote: 引用 1 楼 C_522 的回复:

因为他需要游离在对话框外???

1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????

我试了一下,我在 QDialog的析构函数里加了一句
qDebug()<<"123";

我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。 如果一个QPushButton不是QDialog的子窗体,该怎么删除?



this->close();
一般是隐藏窗口,而不是销毁窗口。

这个对话框是顶层窗体,我点击右上角的关闭应该是销毁窗体把

#5


你可以试一下在closeEvent函数里删除这个button:
void QDialog::closeEvent(QCloseEvent *event)
 {
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
}

#6


引用 5 楼 feileile01 的回复:
你可以试一下在closeEvent函数里删除这个button:
void QDialog::closeEvent(QCloseEvent *event)
 {
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
}

试了下,确实可以这样。。。。

我很好奇为什么,对话框QDialog类里有成员QPushButton,如果这个按钮不是对话框的子窗体,只有两者都关闭的时候才会调用对话框的析构函数.

#7


引用 6 楼 qazaq408 的回复:
Quote: 引用 5 楼 feileile01 的回复:

你可以试一下在closeEvent函数里删除这个button:
void QDialog::closeEvent(QCloseEvent *event)
 {
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
}

试了下,确实可以这样。。。。

我很好奇为什么,对话框QDialog类里有成员QPushButton,如果这个按钮不是对话框的子窗体,只有两者都关闭的时候才会调用对话框的析构函数.

我自己的理解啊,closeEvent()是在关闭窗口的时候调用的,而析构函数是在窗口已经关闭的时候调用,这个button是对话框的子窗体,只关了窗口但没关按钮实际上是窗口没有完全关闭,所以不走析构函数,只有窗口按钮都关了才走析构。

#8


引用 4 楼 qazaq408 的回复:
Quote: 引用 3 楼 C_522 的回复:

Quote: 引用 2 楼 qazaq408 的回复:

Quote: 引用 1 楼 C_522 的回复:

因为他需要游离在对话框外???

1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????

我试了一下,我在 QDialog的析构函数里加了一句
qDebug()<<"123";

我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。 如果一个QPushButton不是QDialog的子窗体,该怎么删除?



this->close();
一般是隐藏窗口,而不是销毁窗口。

这个对话框是顶层窗体,我点击右上角的关闭应该是销毁窗体把



我自己写了个主窗口。无论是窗口本身的关闭按钮,还是我自己调用this->close();都会调用到析构函数的。你确定你没写错???

#1


因为他需要游离在对话框外???

1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????

#2


引用 1 楼 C_522 的回复:
因为他需要游离在对话框外???

1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????

我试了一下,我在 QDialog的析构函数里加了一句
qDebug()<<"123";

我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。 如果一个QPushButton不是QDialog的子窗体,该怎么删除?

#3


引用 2 楼 qazaq408 的回复:
Quote: 引用 1 楼 C_522 的回复:

因为他需要游离在对话框外???

1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????

我试了一下,我在 QDialog的析构函数里加了一句
qDebug()<<"123";

我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。 如果一个QPushButton不是QDialog的子窗体,该怎么删除?



this->close();
一般是隐藏窗口,而不是销毁窗口。

#4


引用 3 楼 C_522 的回复:
Quote: 引用 2 楼 qazaq408 的回复:

Quote: 引用 1 楼 C_522 的回复:

因为他需要游离在对话框外???

1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????

我试了一下,我在 QDialog的析构函数里加了一句
qDebug()<<"123";

我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。 如果一个QPushButton不是QDialog的子窗体,该怎么删除?



this->close();
一般是隐藏窗口,而不是销毁窗口。

这个对话框是顶层窗体,我点击右上角的关闭应该是销毁窗体把

#5


你可以试一下在closeEvent函数里删除这个button:
void QDialog::closeEvent(QCloseEvent *event)
 {
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
}

#6


引用 5 楼 feileile01 的回复:
你可以试一下在closeEvent函数里删除这个button:
void QDialog::closeEvent(QCloseEvent *event)
 {
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
}

试了下,确实可以这样。。。。

我很好奇为什么,对话框QDialog类里有成员QPushButton,如果这个按钮不是对话框的子窗体,只有两者都关闭的时候才会调用对话框的析构函数.

#7


引用 6 楼 qazaq408 的回复:
Quote: 引用 5 楼 feileile01 的回复:

你可以试一下在closeEvent函数里删除这个button:
void QDialog::closeEvent(QCloseEvent *event)
 {
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
}

试了下,确实可以这样。。。。

我很好奇为什么,对话框QDialog类里有成员QPushButton,如果这个按钮不是对话框的子窗体,只有两者都关闭的时候才会调用对话框的析构函数.

我自己的理解啊,closeEvent()是在关闭窗口的时候调用的,而析构函数是在窗口已经关闭的时候调用,这个button是对话框的子窗体,只关了窗口但没关按钮实际上是窗口没有完全关闭,所以不走析构函数,只有窗口按钮都关了才走析构。

#8


引用 4 楼 qazaq408 的回复:
Quote: 引用 3 楼 C_522 的回复:

Quote: 引用 2 楼 qazaq408 的回复:

Quote: 引用 1 楼 C_522 的回复:

因为他需要游离在对话框外???

1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????

我试了一下,我在 QDialog的析构函数里加了一句
qDebug()<<"123";

我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。 如果一个QPushButton不是QDialog的子窗体,该怎么删除?



this->close();
一般是隐藏窗口,而不是销毁窗口。

这个对话框是顶层窗体,我点击右上角的关闭应该是销毁窗体把



我自己写了个主窗口。无论是窗口本身的关闭按钮,还是我自己调用this->close();都会调用到析构函数的。你确定你没写错???