PyQt中的QUiLoader.createWidget等价物

时间:2014-01-09 05:04:16

标签: python pyqt pyside

我有一个PySide应用程序,我正在研究与PyQt4兼容。显然这不应该太难,但我想尽量减少必要的代码更改次数。我遇到的最大区别(影响我的程序)是PyQt没有包装QUiLoader类。

现在我意识到我仍然可以在PyQt中使用uic模块加载ui文件,但是我目前在PySide中使用了QUiLoader的子类,它实现了一些我希望保留的自定义功能,如果可能的话

功能如下。我已经将QUiLoader子类化,并覆盖了createWidget()方法。我的新实现允许您在应用程序运行时动态注册窗口小部件促销。我可以这样做,因为createWidget()方法负责从ui文件中实例化小部件,之后(我相信)标准的QUiLoader实现应用了ui文件中的指定属性。

我的问题是,是否有类似的方法可以在PyQt中覆盖以在运行时动态设置窗口小部件,而不必通过Qt Designer和ui文件静态设置它。

P.S。我正在寻找一种解决方案,它对现有代码的改动很小。例如,如果我可以用在PyQt下提供等效行为的类替换我的PySide QUiLoader子类,那将是理想的。

修改 实现将使用类似:

loader = UiLoader()
loader.registerCustomPromotion("myWidgetNameInQtDesigner",ClassToPromoteTo)
ui = loader.load('myUiFile.ui')

这实际上是我在PySide中用我的QUiLoader子类做的。 .ui文件中名称为"myWidgetNameInQtDesigner"的任何窗口小部件都将被实例化为ClassToPromoteTo的实例。

1 个答案:

答案 0 :(得分:0)

只要您愿意在Qt Designer中推广相关小部件,这就变得非常简单。

我们的想法是向sys.modules添加一个虚拟模块,然后动态修改它包含的自定义窗口小部件类。

因此,如果在Qt Designer中推广窗口小部件时将“头文件”设置为“mylib.dummy”,则在使用PyQt加载ui文件时会执行类似的操作:

from types import ModuleType

# dummy module
module = sys.modules['mylib.dummy'] = ModuleType('dummy')

if mode == 'FOO':
    module.TextEdit = FooTextEdit
    module.LineEdit = FooLineEdit
    module.PushButton = FooPushButton
elif mode == 'BAR':
    module.TextEdit = BarTextEdit
    module.LineEdit = BarLineEdit
    module.PushButton = BarPushButton
else:
    module.TextEdit = QTextEdit
    module.LineEdit = QLineEdit
    module.PushButton = QPushButton

# loadUi/loadUiType will add the following import line:
# from mylib.dummy import TextEdit, LineEdit, PushButton
WidgetUI = uic.loadUiType('mywidget.ui'))[0]
ui = WidgetUI()