然后,我在对话框的构造函数里
buttons = new QPushButton(tr("图片"))
这个buttons没有用this声明他的父对象,也没用过布局管理器安装到对话框上(因为他需要游离在对话框外),然后问题来了,程序运行后当我关闭对话框的时候,那个按钮并没有消失,需要手动关闭,我开始以为这是因为buttons不是对话框的子对象,所以对话框析构的时候没有删除掉他,于是我在对话框的析构函数里加上
delete buttons
我以为这样关闭对话框的时候就会删除掉这个按钮,但实际是关闭对话框后那个按钮还在这边,必须手动关闭,我先回问下这是什么情况,为什么在析构函数里delete了,这个按钮还在这里
8 个解决方案
#1
因为他需要游离在对话框外???
1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????
1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????
#2
我试了一下,我在 QDialog的析构函数里加了一句
qDebug()<<"123";
我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。
#3
this->close();
一般是隐藏窗口,而不是销毁窗口。
#4
因为他需要游离在对话框外???
1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????
我试了一下,我在 QDialog的析构函数里加了一句qDebug()<<"123";
我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。
this->close();
一般是隐藏窗口,而不是销毁窗口。
这个对话框是顶层窗体,我点击右上角的关闭应该是销毁窗体把
#5
你可以试一下在closeEvent函数里删除这个button:
void QDialog::closeEvent(QCloseEvent *event)
{
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
}
void QDialog::closeEvent(QCloseEvent *event)
{
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
}
#6
你可以试一下在closeEvent函数里删除这个button:
void QDialog::closeEvent(QCloseEvent *event)
{
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
}
试了下,确实可以这样。。。。
我很好奇为什么,对话框QDialog类里有成员QPushButton,如果这个按钮不是对话框的子窗体,只有两者都关闭的时候才会调用对话框的析构函数.
#7
你可以试一下在closeEvent函数里删除这个button:
void QDialog::closeEvent(QCloseEvent *event)
{
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
}
试了下,确实可以这样。。。。
我很好奇为什么,对话框QDialog类里有成员QPushButton,如果这个按钮不是对话框的子窗体,只有两者都关闭的时候才会调用对话框的析构函数.
我自己的理解啊,closeEvent()是在关闭窗口的时候调用的,而析构函数是在窗口已经关闭的时候调用,这个button是对话框的子窗体,只关了窗口但没关按钮实际上是窗口没有完全关闭,所以不走析构函数,只有窗口按钮都关了才走析构。
#8
因为他需要游离在对话框外???
1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????
我试了一下,我在 QDialog的析构函数里加了一句qDebug()<<"123";
我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。
this->close();
一般是隐藏窗口,而不是销毁窗口。
这个对话框是顶层窗体,我点击右上角的关闭应该是销毁窗体把
我自己写了个主窗口。无论是窗口本身的关闭按钮,还是我自己调用this->close();都会调用到析构函数的。你确定你没写错???
#1
因为他需要游离在对话框外???
1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????
1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????
#2
因为他需要游离在对话框外???
1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????
我试了一下,我在 QDialog的析构函数里加了一句
qDebug()<<"123";
我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。
#3
因为他需要游离在对话框外???
1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????
我试了一下,我在 QDialog的析构函数里加了一句qDebug()<<"123";
我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。
this->close();
一般是隐藏窗口,而不是销毁窗口。
#4
因为他需要游离在对话框外???
1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????
我试了一下,我在 QDialog的析构函数里加了一句qDebug()<<"123";
我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。
this->close();
一般是隐藏窗口,而不是销毁窗口。
这个对话框是顶层窗体,我点击右上角的关闭应该是销毁窗体把
#5
你可以试一下在closeEvent函数里删除这个button:
void QDialog::closeEvent(QCloseEvent *event)
{
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
}
void QDialog::closeEvent(QCloseEvent *event)
{
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
}
#6
你可以试一下在closeEvent函数里删除这个button:
void QDialog::closeEvent(QCloseEvent *event)
{
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
}
试了下,确实可以这样。。。。
我很好奇为什么,对话框QDialog类里有成员QPushButton,如果这个按钮不是对话框的子窗体,只有两者都关闭的时候才会调用对话框的析构函数.
#7
你可以试一下在closeEvent函数里删除这个button:
void QDialog::closeEvent(QCloseEvent *event)
{
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
}
试了下,确实可以这样。。。。
我很好奇为什么,对话框QDialog类里有成员QPushButton,如果这个按钮不是对话框的子窗体,只有两者都关闭的时候才会调用对话框的析构函数.
我自己的理解啊,closeEvent()是在关闭窗口的时候调用的,而析构函数是在窗口已经关闭的时候调用,这个button是对话框的子窗体,只关了窗口但没关按钮实际上是窗口没有完全关闭,所以不走析构函数,只有窗口按钮都关了才走析构。
#8
因为他需要游离在对话框外???
1.确定有跑析构函数?
2.删除按钮:
delete buttons;
buttons = NULL;
qDebug()<<(buttons == NULL);
3.如果上一个打印 true,按钮还存在的话,你确定你看到的“按钮”是你说的buttons????
我试了一下,我在 QDialog的析构函数里加了一句qDebug()<<"123";
我发现我关闭对话框的时候程序并没有调用对话框的析构函数,而是我关闭按钮的时候才调用析构函数。。。
this->close();
一般是隐藏窗口,而不是销毁窗口。
这个对话框是顶层窗体,我点击右上角的关闭应该是销毁窗体把
我自己写了个主窗口。无论是窗口本身的关闭按钮,还是我自己调用this->close();都会调用到析构函数的。你确定你没写错???