所以我有一个应用程序,我考虑从PyQt4转移到PySide。在此应用程序中,我经常使用.ui
个文件,具有以下使用模式:
class BaseGUIWidget(QWidget):
def __init__(self, parent = None, ui_file = None):
'''
:param parent: parent widget of this widget
:param ui_file: path to UI file to load (optional)
'''
super(BaseGUIWidget, self).__init__(parent)
if ui_file is not None:
uic.loadUi(ui_file, self)
我们假设我有QFrame
,QMainWindow
,QGroupBox
等类似的课程。
这允许我创建使用UI文件中的数据的python类,以及我在代码中手动添加的任何其他功能。从本质上讲,我的BaseGUIWidget
类就像是在扩展UI文件生成的类一样。应用程序中的许多功能都非常依赖于此行为。
然而,据我所知,PySide的QUIloader
并没有类似的功能。而不是“垫片”。将UI文件的内容放入您的类中,它只是在内部从UI文件构建一个小部件,然后将其返回,然后将其嵌入到layout
中的小部件中,就像将任何其他小部件一样。 IE:
class BaseGUIWidget(QWidget):
def __init__(self, parent = None, ui_file = None):
'''
:param parent: parent widget of this widget
:param ui_file: path to UI file to load (optional)
'''
super(BaseGUIWidget, self).__init__(parent)
self.setLayout(QVBoxLayout())
if ui_file is not None:
loader = QUILoader()
uifile = QFile(ui_file)
uifile.open(QFile.ReadOnly)
self.ui_widget = loader.load(ui_file, self)
self.layout().addWidget(self.ui_widget)
uifile.close()
这是一个非常巨大的差异。例如,如果您希望您的UI文件包含QMainWindow
并且您的python类仍然是QMainWindow
的扩展名,那么它就像其他类的行为一样,您最终会结束在QMainWindow
内QMainWindow
,这不是你想要的。这也意味着您必须widget.ui_widget.XXX
来访问UI文件生成的小部件。
有没有办法让PySide的 uic 实现像PyQt一样?
答案 0 :(得分:0)
使用QtPy软件包
TextView tmpView = findViewById(chain.getIngredientNameId()); //TextVeiw
((TextView) findViewById(chain.getIngredientNameId())).setTextSize(8); // TextVeiw
findViewById(chain.getIngredientNameId()); // View
它会自动检测使用过的绑定(pyqt5或pyside2)
pip3 install QtPy
答案 1 :(得分:-2)
实际上我想知道同样的事情,只是尝试了这个:
将uic包从PyQt4安装复制到PySide包(其所有python模块,没有编译库,因此不应存在任何不兼容性)
进行搜索&替换uic包,将“PyQt4”替换为“PySide”
使用它:
from PySide import uic
w = uic.loadUi("mywidget.ui")
w.show()
它也适用于我描述的用例(uic.loadUi(ui_file,self)):) 当然不能保证一切都会有效,但我很惊讶这个黑客让它发挥作用。