在Qt中,hide、close和show之间的区别是什么?

12

在内存方面,PushButton或其他小部件的hide、close和show之间有什么区别?

如果我不想再使用小部件,哪种方法更好?


你尝试过阅读那些插槽的文档吗? - Hayt
2个回答

18

首先,如@Hayt所说,阅读文档。

对于实际答案:

  1. hide()setVisible(false)相同。
  2. show()setVisible(true)相同。
  3. close()尝试通过触发QCloseEvent来关闭小部件,如果事件被接受,则结果为:

    1. 如果小部件上没有设置Qt::WA_DeleteOnClose属性(默认情况下),则与调用hide()相同。

    2. 如果设置了Qt::WA_DeleteOnClose,则与调用deleteLater()相同。

就内存而言,这3个中的任何一个都不会改变任何内容(除了close()如果您设置了Qt::WA_DeleteOnClose)。如果您不想再使用小部件,最好将其删除:

delete pointerToMyWidget;
或者
pointerToMyWidget->deleteLater();

第二种形式通常更安全,因为第一种形式可能会因为你写入的位置不当而导致危险。(例如,在一个由你删除的小部件发出的信号调用的插槽中删除它)。


你可以使用close()删除(并释放内存)小部件,只需管理信号即可。 - Landelin Delcoucq
或者你可以通过调用 delete 来删除它。 - Benjamin T
@BenjaminT 如果你使用 delete 删除它,请确保它没有父级,否则当它被销毁时,父级将再次调用 delete - Notin_sensus
@Valerio 不会,子项会从其父项子项列表中移除自己。这是通过在~QObject()中调用d->setParent_helper(0);来完成的。因此,当父项被销毁时,已删除的子项不会再次被删除,因为它不再列为子项。 - Benjamin T

1
根据Qt,您可以阅读以下内容:
关闭: 关闭此小部件。如果小部件已关闭,则返回true;否则返回false。 首先,它会向小部件发送一个QCloseEvent。如果接受关闭事件,则隐藏小部件。如果忽略该事件,则不会发生任何事情。QWidget :: closeEvent()的默认实现接受关闭事件。 如果小部件具有Qt :: WA_DeleteOnClose标志,则也会删除小部件。无论小部件是否可见,都会向小部件传递关闭事件。 当关闭具有Qt :: WA_QuitOnClose属性集的最后一个可见主窗口(即没有父级的窗口)时,将发出QApplication :: lastWindowClosed()信号。默认情况下,此属性设置为所有小部件,除了短暂窗口(例如启动屏幕、工具窗口和弹出菜单)。

.

HIDE:隐藏小部件。此函数等效于setVisible(false)。

注意:如果您正在使用QDialog或其子类,并在调用此函数后调用show()函数,则对话框将显示在其原始位置。

.

SHOW:显示小部件及其子小部件。此功能相当于setVisible(true)。

如果您不需要使用小部件,请调用close()。您可以管理事件以销毁小部件。

hide()仅隐藏。这只是图形上的,您看不到小部件,但不会销毁它。

但我认为函数的名称足够明确,可以理解!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接