代码之家  ›  专栏  ›  技术社区  ›  Vector

Qt:关闭、销毁和稍后删除之间有什么区别?

  •  1
  • Vector  · 技术社区  · 7 年前

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

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

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

    1 回复  |  直到 7 年前
        1
  •  5
  •   aatwo    7 年前

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

    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()后,您应该将其设置为null ptr,因为您不确定它实际何时会被删除:

    myWidget->deleteLater();
    myWidget = nullptr;
    

    在您的示例中,您使用计时器在x毫秒后隐藏小部件。如果要删除,请使用以下选项:

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

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

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

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