[英]pyside2 connect close by Window "X" to custom exit method
我使用 Qt Designer 進行 GUI 布局,並在 QUILoader 的幫助下將 .ui 文件加載到 python 中。
我設法將“退出”按鈕連接到我的“quit_app”方法。
我的問題是,如果用戶嘗試使用“X”關閉窗口,如何連接此方法。
提前致謝!
---> 蟒蛇代碼 <---
import sys
from PySide2.QtUiTools import QUiLoader
from PySide2.QtWidgets import QApplication
from PySide2.QtCore import QFile
class main_w(object):
def __init__(self):
# load ui; create w
self.file = QFile("simple_quit.ui")
self.file.open(QFile.ReadOnly)
self.loader = QUiLoader()
self.w = self.loader.load(self.file)
# connections
# Quit Button
self.w.QUITButton.clicked.connect(self.quit_app)
# ??? Window's X Button ???
# THROWS ERROR:
self.w.closeEvent.connect(self.quit_app)
def quit_app(self):
# some actions to perform before actually quitting:
print('CLEAN EXIT')
app.exit()
def show(self):
self.w.show()
app = QApplication(sys.argv)
w = main_w()
w.show()
sys.exit(app.exec_())
---> UI XML <---
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>MainWindow</string>
</property>
<widget class="QWidget" name="centralwidget">
<widget class="QPushButton" name="QUITButton">
<property name="geometry">
<rect>
<x>100</x>
<y>100</y>
<width>75</width>
<height>23</height>
</rect>
</property>
<property name="text">
<string>quit</string>
</property>
</widget>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>21</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
在 Qt 中有 2 個概念:信號和事件,信號連接到一個插槽,但在事件的情況下你不能,然后你有后者。 在信號的情況下,知道誰是接收者,因為它是在連接中聲明的,但事件不是,這是通過QObject
的父子關系樹發送的,可以根據案子。
所以這就是為什么你有這個問題。
通常的解決方案是覆蓋 closeEvent 方法:
C++ 版本:
void MainWindow::closeEvent(QCloseEvent *event)
{
if (maybeSave()) {
writeSettings();
event->accept();
} else {
event->ignore();
}
}
蟒蛇版本:
def closeEvent(self, event):
if maybeSave():
writeSettings()
event.accept()
else:
event.ignore()
但是為此,有必要從類繼承,但在您的情況下這是不可能的,因此有另一種解決方案,安裝事件過濾器:
import sys
from PySide2 import QtCore, QtWidgets, QtUiTools
class Manager(QtCore.QObject):
def __init__(self):
super(Manager, self).__init__()
# load ui; create w
file = QtCore.QFile("simple_quit.ui")
file.open(QtCore.QFile.ReadOnly)
loader = QtUiTools.QUiLoader()
self.w = loader.load(file)
# connections
# Quit Button
self.w.QUITButton.clicked.connect(self.quit_app)
self.w.installEventFilter(self)
def eventFilter(self, obj, event):
if obj is self.w and event.type() == QtCore.QEvent.Close:
self.quit_app()
event.ignore()
return True
return super(Manager, self).eventFilter(obj, event)
@QtCore.Slot()
def quit_app(self):
# some actions to perform before actually quitting:
print('CLEAN EXIT')
self.w.removeEventFilter(self)
app.quit()
def show(self):
self.w.show()
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
w = Manager()
w.show()
sys.exit(app.exec_())
def closeEvent(self, event):
if pendingChanges == True: #write your required condition/check
self.save() #include required your functionality(eg. self.save())
event.accept()
else:
event.ignore()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.