簡體   English   中英

pyside2 通過窗口“X”連接到自定義退出方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM