|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
如何让MinuteK跟随主窗口一起关闭,不使用Qt.Tool
'
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *
import sys
def create_painter(qp, color, width):
qp.save()
pen = QPen(QColor(color), width)
qp.setPen(pen)
return qp
class CustomSubWindow(QMdiSubWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("子窗口")
self.a = 0
self.initUI()
def initUI(self):
self.label = QLabel("双击子窗口中的任意位置", self)
layout = QVBoxLayout()
layout.addWidget(self.label)
container = QWidget()
container.setLayout(layout)
self.setWidget(container)
def mouseDoubleClickEvent(self, event: QMouseEvent):
if event.button() == Qt.LeftButton:
self.a += 1
print("子窗口被双击了", self.a)
self.label.setText("双击事件已捕获")
# 创建并显示 MinuteK 窗口
self.minute_k_window = MinuteK()
self.minute_k_window.setWindowFlags(Qt.WindowStaysOnTopHint)
self.minute_k_window.show()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("主窗口")
self.setGeometry(100, 100, 800, 600)
self.mdi_area = QMdiArea()
self.setCentralWidget(self.mdi_area)
self.createSubWindow()
def createSubWindow(self):
self.sub_window = CustomSubWindow()
self.mdi_area.addSubWindow(self.sub_window)
self.sub_window.show()
class MinuteK(QWidget):
def __init__(self, parent=None):
super(MinuteK, self).__init__(parent)
self.init_ui()
def init_ui(self):
self.setWindowTitle("MinuteK 窗口")
self.setGeometry(100, 100, 400, 400)
# 可以在这里添加更多的 UI 元素
def paintEvent(self, event):
qp = QPainter(self)
create_painter(qp, Qt.red, 2).drawLine(50, 50, 100, 50)
qp.restore()
if __name__ == "__main__":
app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec())
'
如果你希望 `MinuteK` 窗口保持独立显示,并跟随主窗口一起关闭,推荐的办法是通过显式地设置子窗口和独立窗口的生命周期管理关系。以下提供一个可靠的解决方案,保证 `MinuteK` 窗口跟随主窗口或子窗口关闭。
请使用以下代码:
from PySide6.QtCore import *
from PySide6.QtGui import *
from PySide6.QtWidgets import *
import sys
def create_painter(qp, color, width):
qp.save()
pen = QPen(QColor(color), width)
qp.setPen(pen)
return qp
class CustomSubWindow(QMdiSubWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.setWindowTitle("子窗口")
self.a = 0
self.minute_k_window = None # 用于保存 MinuteK 窗口的引用
self.initUI()
def initUI(self):
self.label = QLabel("双击子窗口中的任意位置", self)
layout = QVBoxLayout()
layout.addWidget(self.label)
container = QWidget()
container.setLayout(layout)
self.setWidget(container)
def mouseDoubleClickEvent(self, event: QMouseEvent):
if event.button() == Qt.LeftButton:
self.a += 1
print("子窗口被双击了", self.a)
self.label.setText("双击事件已捕获")
if not self.minute_k_window:
# 创建并显示 MinuteK 窗口
self.minute_k_window = MinuteK()
self.minute_k_window.setAttribute(Qt.WA_DeleteOnClose) # 让窗口在关闭时自动销毁
self.minute_k_window.show()
def closeEvent(self, event):
# 子窗口关闭时,关闭 MinuteK 窗口(如果存在)
if self.minute_k_window:
self.minute_k_window.close()
super().closeEvent(event)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("主窗口")
self.setGeometry(100, 100, 800, 600)
self.mdi_area = QMdiArea()
self.setCentralWidget(self.mdi_area)
self.createSubWindow()
def createSubWindow(self):
self.sub_window = CustomSubWindow()
self.mdi_area.addSubWindow(self.sub_window)
self.sub_window.show()
def closeEvent(self, event):
# 确保所有子窗口(包括子窗口的附属窗口)在主窗口关闭时也关闭
for sub_window in self.mdi_area.subWindowList():
sub_window.close()
super().closeEvent(event)
class MinuteK(QWidget):
def __init__(self, parent=None):
super(MinuteK, self).__init__(parent)
self.init_ui()
def init_ui(self):
self.setWindowTitle("MinuteK 窗口")
self.setGeometry(200, 200, 400, 400)
def paintEvent(self, event):
qp = QPainter(self)
create_painter(qp, "red", 2).drawLine(50, 50, 100, 50)
qp.restore()
if __name__ == "__main__":
app = QApplication(sys.argv)
mainWin = MainWindow()
mainWin.show()
sys.exit(app.exec())
### 修改点总结:
1. **`MinuteK` 的生命周期管理:**
- 如果 `MinuteK` 是独立窗口,我们通过设置 `Qt.WA_DeleteOnClose` 属性,确保在窗口关闭后系统释放。
2. **主窗口的关闭管理:**
- 在 `MainWindow` 的 `closeEvent` 方法中,遍历所有子窗口并显式关闭,这样与主窗口关联的窗口都会自动销毁。
3. **子窗口的关闭管理:**
- 在 `CustomSubWindow` 的 `closeEvent` 中,检查并关闭 `MinuteK` 窗口,确保不留残留窗口。
### 运行结果:
- 双击子窗口会打开独立的 `MinuteK` 窗口。
- 关闭子窗口时,`MinuteK` 会自动关闭。
- 关闭主窗口时,所有子窗口与 `MinuteK` 也会自动关闭。
这个设计简洁并且稳定,确保所有窗口之间的对象关系和生命周期管理无缝衔接。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
|
|