gpt4 book ai didi

python - 使用 uic.loadUI() 重新定义(覆盖)PyQt5 中的方法

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

实际上,几周以来我一直在使用 PyQt5 和 QtDesigner 开发一个小型软件。我看了很多教程并寻找了很多答案,但我找不到关于使用 uic.loadUI() 重写 QWidget 方法的方法。

请注意,我已尽可能简化了我的测试代码,以准确指出我的问题所在:

1/这个不起作用,它可以正确加载我的 file.ui,但单击不会执行任何操作:

import sys
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QWidget

class Window(QWidget):
def __init__(self):
super().__init__() # Or QWidget.__init__(self)
self.dlg = uic.loadUi("file.ui")
self.dlg.show()

def mousePressEvent(self, event):
print("click !")


if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
app.exec_()

2/但我发现那个确实有效:

class Window(QWidget):
def __init__(self):
QWidget.__init__(self)
self.setWindowTitle("My window")
self.show()

def mousePressEvent(self, event):
print("click !")


if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
app.exec_()

据我所知,这似乎是因为我无法重写事件的方法。由于 mousePressEvent 不是附加到我的 QWidget 子类 self.dlg 的方法。

现在我知道为什么了,我想知道如何重写 mousePressEvent 方法并使用它。我想知道在重写该方法后“加载”该方法,或者调用 QWidget 方法来重新定义它,或者只是创建我自己的方法来捕获任何事件,但我尝试的一切都完全失败了。

无论如何,提前感谢您的回答/提示/祈祷。

最佳答案

假设在创建 file.ui 时您使用的是 Widget 模板:

enter image description here

那么解决办法如下:

import sys
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QWidget

class Window(QWidget):
def __init__(self):
super().__init__()
uic.loadUi("file.ui", self)
self.show()

def mousePressEvent(self, event):
print("click !")


if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
app.exec_()

为什么使用时不起作用 self.dlg = uic.loadUi("file.ui") 因为正如您所指出的,创建的小部件 is self.dlguic.loadUi("file.ui", self) 的情况下,这仍然是从未显示的 win 窗口的一个属性。您指出它不会创建窗口,而是填充现有窗口

更新:

根据您得到的错误:

TypeError: ('Wrong base class of toplevel widget', (<class '__main__.Window'>, 'QMainWindow'))

这让我推断你没有使用QWidget作为基础,而是使用QMainWindow,因此Window必须继承自QMainWindow:

import sys
from PyQt5 import uic
from PyQt5.QtWidgets import QApplication, QMainWindow

class Window(QMainWindow):
def __init__(self):
super().__init__()
uic.loadUi("file.ui", self)
self.show()

def mousePressEvent(self, event):
print("click !")


if __name__ == '__main__':
app = QApplication(sys.argv)
win = Window()
app.exec_()

关于python - 使用 uic.loadUI() 重新定义(覆盖)PyQt5 中的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55220600/

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