【问题标题】:Qt: What is the difference between close,destroy and delete later?Qt:关闭、销毁和稍后删除有什么区别?
【发布时间】:2017-07-19 10:05:17
【问题描述】:

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

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

这里我使用了hide来隐藏对象。如果我使用close而不是hide,它会在超时后删除对象吗?破坏呢?

【问题讨论】:

标签: c++ qt object qtimer


【解决方案1】:

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

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

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() 函数,但知道它不会被删除,除非它是您应用程序中最后一个可见的小部件。

【讨论】:

    猜你喜欢
    • 2014-05-10
    • 1970-01-01
    • 2013-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-06-08
    • 2014-04-13
    • 2010-12-20
    相关资源
    最近更新 更多