Qt:以后关闭,销毁和删除有什么区别?

时间:2017-07-19 10:05:17

标签: c++ qt object qtimer

close,destroy和deletelater之间有什么区别。我想在超时后杀死/删除一个对象。

QTimer::singleShot(tim*1000, &qPopup, &QLabel::hide)

这里我用hide来隐藏对象。如果我使用close而不是hide,它会在超时后删除对象吗?毁灭怎么办?

1 个答案:

答案 0 :(得分:3)

Close只是一种为程序员提供更大灵活性的机制,因为它可用于在窗口小部件/窗口关闭时执行特殊操作(例如,如果用户未保存更改,则显示保存对话框而不是实际关闭窗口一个文件)。默认情况下,窗口小部件仅在关闭时隐藏,并且不会被删除。但是有一个重要的例外。如果所有应用程序顶级窗口都关闭,那么它们都会被删除并退出应用程序。

可以使用以下函数修改此行为:

myWidget->setAttribute( Qt::WA_DeleteOnClose, true ); // Widget will be deleted automatically when closed
myWidget->setAttribute( Qt::WA_DeleteOnClose, false ); // Widget will not be deleted automatically when closed unless it's the last visible widget.

deleteLater()函数标记要删除的窗口小部件,但不会立即删除任何内容。通常在下一个运行循环中删除该对象。这是删除小部件的首选方法,因为它可以防止某些事件相关情况下的崩溃。如果你存储一个指向QWidget的指针,那么你应该在使用deleteLater()之后将它设置为nullptr,因为你不确定它什么时候会被删除:

myWidget->deleteLater();
myWidget = nullptr;

Destroy()是一个你可能永远不需要使用的函数。它由QWidget析构函数自动调用,并释放与窗口相关的系统资源。你应该坚持使用deleteLater()。

因此,在您的示例中,您使用计时器在x毫秒后隐藏窗口小部件。如果要删除它,请使用:

QTimer::singleShot(tim*1000, &qPopup, &QLabel::deleteLater);

或者您可以在窗口小部件上设置delete_on_close标志,并将计时器连接到close()函数:

qPopup->setAttribute( Qt::WA_DeleteOnClose, true );
QTimer::singleShot(tim*1000, &qPopup, &QLabel::close);

或者您可以继续使用hide()函数,但要知道它不会被删除,除非它是应用程序中最后一个可见的小部件。