在PyQt/PySide生成的代码之外添加事件函数



我使用PySide的方式不是MVC模式,也就是说,我尽可能不编辑生成的.ui到.py文件,我将应用程序逻辑放在包(模型)中,我有一个模块(.pyw文件)更像是一个控制器,用于初始化和执行管理。不是最好的做法,但我做得很好,我只想不想在生成的ui.py文件中添加代码(更像我的视图)

现在问题来了

我注意到生成的PySide文件并不是从QDialog或QMainWindow继承的,因为在实例化类时必须创建它,因此,即使将closeEvent(self, event)之类的事件放在类中,它也不能在类中工作。我知道如何为QActions和小部件连接编写函数,但我不知道如何在类之外将基于类的函数添加到生成的PYSIDE类中。

如果我必须编辑生成的视图类,我可以完美地将其调整为我想要的,但我不想这样做,因为我可以在QtDesigner中进行修改并随时编译

这是我的问题,因为我不想在不接触生成的视图类的情况下,如何将closeEvent附加到从控制器类中的类创建的对象上。

感谢

永远不需要编辑pyside uic生成的ui模块。

有三种主要方法可以将类级功能添加到Qt Designer的小部件中。首先,对于顶级小部件,您可以简单地创建一个子类,如下所示:

from PyQt4 import QtCore, QtGui
from mainwindow_ui import Ui_MainWindow
class MainWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
Ui_MainWindow().setupUi(self)
def closeEvent(self, event):
print('Goodbye world!')
QtGui.QMainWindow.closeEvent(self, event)

其次,对于不是顶级的小部件,可以使用事件过滤器,如下所示:

class MainWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
...
self.lineEdit.installEventFilter(self)
def eventFilter(self, source, event):
if (event.type() == QtCore.QEvent.MouseMove and
source is self.lineEdit):
print('mouse-move:', event.globalPos())
return QtGui.QMainWindow.eventFilter(self, source, event)

因此,您可以通过事件过滤器侦听相同的事件,而不是在QLineEdit子类中重新实现mouseMoveEvent。所有受保护的函数都有一个相应的事件类型,可以通过这种方式访问。

最后一种方法是小部件升级,它的设置更复杂,但可能提供了最大的灵活性。这允许您用自己的自定义子类完全替换Qt Designer中的小部件。

要做到这一点,在Qt Designer中,您可以右键单击要替换的小部件,然后选择"升级到…"。在对话框中,将"升级的类名"设置为您的自定义子类(例如"MyLineEdit"),并将"头文件"设置为包含子类的模块的python导入路径(例如"myapp"或"myapp.gui")。接下来,您将单击"添加",然后单击"升级",您将在对象检查器窗格中看到类从"QLineEdit"更改为"MyLineEdit"。

有了它,您所需要做的就是确保myapp模块包含一个MyLineEdit类,该类可以由pyside-uic生成的.ui模块导入。

Monkey Patching完成了任务,我不知道为什么我没有教

最新更新