PyQt4: обнаружение события закрытия окна из дочернего класса - PullRequest
0 голосов
/ 19 января 2020
class Ui_MainWindow(QtGui.QWidget):

  def __init__(self):
      super(Ui_MainWindow, self).__init__()
      print('[Ui_MainWindow] __init__')

  def closeEvent(self, event):
      print("[ Ui_MainWindow closeEvent] event triggered...")

...

class Ui_Wrapper(Ui_MainWindow):
    def __init__(self, MainWindow):
        super(Ui_Wrapper, self).__init__()

        self.MainWindow = MainWindow
        self.setupUi(MainWindow)
        self.add_listeners()

        MainWindow.show()

    def closeEvent(self, event):
        print("[ Ui_Wrapper closeEvent] event triggered...")
        super(Ui_Wrapper,self).closeEvent(event)
...

Фрагмент A:

if __name__ == "__main__":
    ...
    print(sys.argv)
    app = QtGui.QApplication(sys.argv)
    MainWindow = QtGui.QMainWindow()
    ui = Ui_Wrapper(MainWindow)
    sys.exit(app.exec_())

Фрагмент B:

app = QtGui.QApplication(sys.argv)
MainWindow = QtGui.QMainWindow()
ui = Ui_MainWindow()
...
ui.show()

Фрагмент A и B оба отображают GUI, но только фрагмент B позволяет мне захватывать CloseEvent. Я использую инструмент проектирования PyQT для создания GUI, основной файл GUI каждый раз перезаписывается, поэтому мне нужна оболочка (Ui_Wrapper) для обработки настроек слушателя и т. Д. c. Вот почему мне нужно использовать фрагмент А.

Есть идеи? Я что-то пропустил в своей функции init ?

Ответы [ 2 ]

1 голос
/ 19 января 2020

Я нашел обходной путь, который сейчас могу использовать, используя ui.loadUi . Это позволяет мне вносить изменения в QT Designer, не затрагивая мой код. Подробная статья об этом здесь: импорт файлов PyQT ui

class Ui_MainWindow(QtGui.QMainWindow):

    def __init__(self):
        super(Ui_MainWindow, self).__init__()
        uic.loadUi('app.ui', self)
        self.add_listeners()
        self.show()
0 голосов
/ 30 января 2020

Запускаете ли вы файл .ui через инструмент ui c, чтобы создать файл Python, содержащий ваш Ui_MainWindow? Я ожидаю, что результат этого будет выглядеть примерно так:

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'C:\Users\gary\Desktop\mw\MainWindow.ui'
#
# Created by: PyQt4 UI code generator 4.11.4
#
# WARNING! All changes made in this file will be lost!

from PyQt4 import QtCore, QtGui

try:
    _fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
    def _fromUtf8(s):
        return s

try:
    _encoding = QtGui.QApplication.UnicodeUTF8
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
    def _translate(context, text, disambig):
        return QtGui.QApplication.translate(context, text, disambig)

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName(_fromUtf8("MainWindow"))
        MainWindow.resize(400, 300)

        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        MainWindow.setWindowTitle(_translate("MainWindow", "Form", None))


Результат будет перезаписываться при каждом изменении пользовательского интерфейса в Designer и повторном запуске пользовательского интерфейса c, как вы и сказали. Таким образом, в отдельном файле вы импортируете Ui_MainWindow и подкласс для переопределения closeEvent():

from PyQt4 import QtGui
from Ui_MainWindow import Ui_MainWindow


class MainWindow(QtGui.QWidget, Ui_MainWindow):

    def __init__(self, parent=None):
        super(MainWindow, self).__init__(parent)
        self.setupUi(self)

    def closeEvent(self, event):
        print("[ MainWindow closeEvent] event triggered...")
        super(MainWindow, self).closeEvent(event)


if __name__ == "__main__":
    import sys
    app = QtGui.QApplication(sys.argv)
    main_window = MainWindow()
    main_window.show()
    sys.exit(app.exec_())
...