我的回答旨在解释其他答案未说明的细节,以便您了解它如何处理内存 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(),因为这不会破坏小部件,因此当您想将已移除的小部件放置到另一个小部件时,会考虑使用该方法。