gpt4 book ai didi

python - pyside2 通过 Window "X"连接关闭到自定义退出方法

转载 作者:行者123 更新时间:2023-12-01 18:16:24 25 4
gpt4 key购买 nike

我使用 Qt Designer 进行 GUI 布局,并在 QUILoader 的帮助下将 .ui 文件加载到 python 中。

我设法将“退出”按钮连接到我的“quit_app”方法。

我的问题是,如果用户尝试使用“X”关闭窗口,如何连接此方法。

提前致谢!

--->Python代码<---

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();
}
}

Python 版本:

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_())

关于python - pyside2 通过 Window "X"连接关闭到自定义退出方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53097415/

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