gpt4 book ai didi

python - 动态创建的选项卡-选项卡关闭时销毁对象

转载 作者:太空宇宙 更新时间:2023-11-04 11:15:56 27 4
gpt4 key购买 nike

我正在动态创建多个选项卡,我想知道当我关闭选项卡时,它是否真的销毁了对象?

我已将动态创建的选项卡的属性设置为 QtCore.Qt.WA_DeleteOnClose

我假设设置该属性不会执行任何操作,因为不会对其调用 closeEvent。

    self.tabWidget.tabCloseRequested.connect(self.close_handler) # connect close button to slot

def close_handler(self, index):
'Remove added tab if applicable'
try:
#self.tabWidget.widget(index).deleteLater() #does this need to be added?
self.tabWidget.removeTab(index)
except:
Data.logger.exception('Exception occured:')

如何确保对象被销毁?

最佳答案

我的答案是为了解释其他答案没有说明的细节,以便你了解Qt是如何处理内存的。

如果你想知道一个 QObject 是否被消除,那么你必须使用 destroyed信号。

如果你想删除一个QObject,你必须使用deleteLater()方法。

在删除添加到 QTabWidget 的小部件的情况下,这将通知 QTabBar 它将被删除,因此不存在访问非保留内存的问题。

考虑到上述情况,一个可能的解决方案是:

def close_handler(self, index):
widget = self.tabWidget.widget(index)
widget.deleteLater()

您可以通过以下示例进行检查:

from PyQt5 import QtCore, QtGui, QtWidgets, QtWebEngineWidgets


class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)

self.tabWidget = QtWidgets.QTabWidget(tabsClosable=True)
self.tabWidget.tabCloseRequested.connect(self.onTabCloseRequested)
self.setCentralWidget(self.tabWidget)

for i in range(10):
widget = QtWidgets.QWidget()
widget.destroyed.connect(
lambda obj: print(
"deleted {}, count: {}".format(obj, self.tabWidget.count())
)
)
self.tabWidget.addTab(widget, "Tab %s" % (i))

@QtCore.pyqtSlot(int)
def onTabCloseRequested(self, index):
widget = self.tabWidget.widget(index)
widget.deleteLater()


if __name__ == "__main__":
import sys

app = QtWidgets.QApplication(sys.argv)
w = MainWindow()
w.resize(640, 480)
w.show()
sys.exit(app.exec_())

如您所见,不必使用 Qt::WA_DeleteOnClose 属性,但如果使用它,关闭小部件就足够了。

class MainWindow(QtWidgets.QMainWindow):
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)

self.tabWidget = QtWidgets.QTabWidget(tabsClosable=True)
self.tabWidget.tabCloseRequested.connect(self.onTabCloseRequested)
self.setCentralWidget(self.tabWidget)

for i in range(10):
widget = QtWidgets.QWidget()
widget.setAttribute(QtCore.Qt.WA_DeleteOnClose)
widget.destroyed.connect(
lambda obj: print(
"deleted {}, count: {}".format(obj, self.tabWidget.count())
)
)
self.tabWidget.addTab(widget, "Tab %s" % (i))

@QtCore.pyqtSlot(int)
def onTabCloseRequested(self, index):
widget = self.tabWidget.widget(index)
widget.close()

没有必要使用removeTab()由于这不会破坏小部件,因此认为该方法可以在您想要将小部件移除到另一个小部件时使用。

关于python - 动态创建的选项卡-选项卡关闭时销毁对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57013483/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com