Python 从ui文件加载的PySide2 QMainWindow未触发窗口事件
我正在从一个.ui文件加载一个QMainWindow-它工作正常,但不会触发诸如resize之类的窗口事件。我真的不知道我做错了什么 代码如下: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
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_())