Python 从ui文件加载的PySide2 QMainWindow未触发窗口事件

Python 从ui文件加载的PySide2 QMainWindow未触发窗口事件,python,qt-designer,pyside2,Python,Qt Designer,Pyside2,我正在从一个.ui文件加载一个QMainWindow-它工作正常,但不会触发诸如resize之类的窗口事件。我真的不知道我做错了什么 代码如下: class TestWindow(QMainWindow): def __init__(self, parent=None): super(TestWindow, self).__init__(parent) loader = QUiLoader() file = QFile(abspath("u

我正在从一个.ui文件加载一个QMainWindow-它工作正常,但不会触发诸如resize之类的窗口事件。我真的不知道我做错了什么

代码如下:

class TestWindow(QMainWindow):
    def __init__(self, parent=None):
        super(TestWindow, self).__init__(parent)
        loader = QUiLoader()
        file = QFile(abspath("ui/mainwindow.ui"))
        file.open(QFile.ReadOnly)
        self.window = loader.load(file, parent)
        file.close()
        self.window.show()

    def resizeEvent(self, event):
        print "resize"

app = QApplication(sys.argv)
test = TestWindow()

sys.exit(app.exec_())

可以找到.ui文件。

您似乎有点困惑,但要理解调用TestWindow的测试方法:

import os
from PySide2 import QtCore, QtWidgets, QtUiTools

class TestWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(TestWindow, self).__init__(parent)
        loader = QtUiTools.QUiLoader()
        file = QtCore.QFile(os.path.abspath("ui/mainwindow.ui"))
        file.open(QtCore.QFile.ReadOnly)
        self.window = loader.load(file, parent)
        file.close()
        self.window.show()
        self.show()

    def resizeEvent(self, event):
        print("resize")

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    test = TestWindow()
    sys.exit(app.exec_())
如果移动小窗口,请观察事件是否已触发

为什么会发生这种情况?:QUiLoader基于.ui创建一个小部件,与PyQt5的uic.loadUi或ui.loadUiType不同,它不在主小部件中加载,而是创建一个新的小部件,这可能是一个缺点,但这是限制

因此,根据您想做什么,有几个选项:

要使用QUiLoader加载.ui,不需要将TestWindow作为父对象,因为它可以是通过事件过滤器监视事件的QObject。 另一个选项是将self.widow作为.ui中的QMainWindow的中心widget,因此调整大小将从TestWindow开始,而不是从.ui开始,但是如果.ui的大小发生了更改,TestWindow也会发生同样的情况: 前面的方法仅用于通知事件,但如果要覆盖,最好使用pyuic将.ui转换为.py
您似乎有点困惑,但要理解调用TestWindow的测试方法:

import os
from PySide2 import QtCore, QtWidgets, QtUiTools

class TestWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(TestWindow, self).__init__(parent)
        loader = QtUiTools.QUiLoader()
        file = QtCore.QFile(os.path.abspath("ui/mainwindow.ui"))
        file.open(QtCore.QFile.ReadOnly)
        self.window = loader.load(file, parent)
        file.close()
        self.window.show()
        self.show()

    def resizeEvent(self, event):
        print("resize")

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    test = TestWindow()
    sys.exit(app.exec_())
如果移动小窗口,请观察事件是否已触发

为什么会发生这种情况?:QUiLoader基于.ui创建一个小部件,与PyQt5的uic.loadUi或ui.loadUiType不同,它不在主小部件中加载,而是创建一个新的小部件,这可能是一个缺点,但这是限制

因此,根据您想做什么,有几个选项:

要使用QUiLoader加载.ui,不需要将TestWindow作为父对象,因为它可以是通过事件过滤器监视事件的QObject。 另一个选项是将self.widow作为.ui中的QMainWindow的中心widget,因此调整大小将从TestWindow开始,而不是从.ui开始,但是如果.ui的大小发生了更改,TestWindow也会发生同样的情况: 前面的方法仅用于通知事件,但如果要覆盖,最好使用pyuic将.ui转换为.py
非常感谢,这确实解决了问题。我不需要覆盖事件。非常感谢,这确实解决了问题。我不需要覆盖事件。
import os
from PySide2 import QtCore, QtWidgets, QtUiTools

class TestWindow(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(TestWindow, self).__init__(parent)
        loader = QtUiTools.QUiLoader()
        file = QtCore.QFile(os.path.abspath("ui/mainwindow.ui"))
        if file.open(QtCore.QFile.ReadOnly):
            self.window = loader.load(file, parent)
            file.close()
            self.setCentralWidget(self.window)
            self.show()

    def resizeEvent(self, event):
        print("resize")

if __name__ == '__main__':
    import sys
    app = QtWidgets.QApplication(sys.argv)
    test = TestWindow()
    sys.exit(app.exec_())