PySide/PyQt QMainWindow 如何关闭 QDockWidget?

Posted

技术标签:

【中文标题】PySide/PyQt QMainWindow 如何关闭 QDockWidget?【英文标题】:How does PySide/PyQt QMainWindow close a QDockWidget? 【发布时间】:2014-01-31 18:51:16 【问题描述】:

我需要知道 QDockWidget 是如何正常关闭的。我有一个连接到 QDockWidget 的串口/线程,我需要确保线程和串口正确关闭。

class SerialDock(QDockWidget):
    ...

    def close(self):
        print("Close")
        self.serialport.close()
        self.thread.close()

    def closeEvent(self, event):
        print("closeEvent")
        self.serialport.close()
        self.thread.close()

当我单击 QMainWindow X 按钮时,不会调用 close 和 closeEvents。我是否必须从 QMainWindow close 调用 close 方法?我知道解决这个问题的唯一方法是使用 QApplication.aboutToQuit 信号,我真的不想记住为一个特定的小部件设置它。 QDockWidget 是如何被销毁或关闭的?

【问题讨论】:

【参考方案1】:

您可以在QDockWidget 中使用destroyed 信号:

import PyQt4.QtGui as ui
import PyQt4.QtCore as core

app = ui.QApplication([])

mw = ui.QMainWindow()
mw.setCentralWidget(ui.QTextEdit())

dw = ui.QDockWidget("Test",mw)
dw.setWidget(ui.QLabel("Content"))

mw.addDockWidget(core.Qt.RightDockWidgetArea, dw)

def onDestroy(w):
    print("Do stuff here")
    print(w)

dw.destroyed.connect(onDestroy)

mw.show()
app.exec_()

【讨论】:

这行得通,但我收到信号太晚了,无法关闭我的其他项目。

以上是关于PySide/PyQt QMainWindow 如何关闭 QDockWidget?的主要内容,如果未能解决你的问题,请参考以下文章

PySide/PyQt 中 QTableWidget 的 QMenu

在 PySide/PyQt 中使用 drawPolyline 制作动画波浪

PySide2(PyQt5)根据屏幕大小初始化窗口大小

PySide2(PyQt5) 实现tab切换及方法详解(不定时更新)

如何为布局中的列设置正确的大小 - PySide/PyQt

Python/pyside,pyqt(pyside,pyqt optional): 控制文本选择的函数