是否有可能让PySide的QUIloader像PyQt的uic.loadUi一样?

时间:2014-05-27 22:25:54

标签: python qt python-2.7 pyqt4 pyside

所以我有一个应用程序,我考虑从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)

我们假设我有QFrameQMainWindowQGroupBox等类似的课程。

这允许我创建使用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的扩展名,那么它就像其他类的行为一样,您最终会结束在QMainWindowQMainWindow,这不是你想要的。这也意味着您必须widget.ui_widget.XXX来访问UI文件生成的小部件。

有没有办法让PySide的 uic 实现像PyQt一样?

2 个答案:

答案 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)

实际上我想知道同样的事情,只是尝试了这个:

  1. 将uic包从PyQt4安装复制到PySide包(其所有python模块,没有编译库,因此不应存在任何不兼容性)

  2. 进行搜索&替换uic包,将“PyQt4”替换为“PySide”

  3. 使用它:

    from PySide import uic
    
    w = uic.loadUi("mywidget.ui")
    w.show()
    
  4. 它也适用于我描述的用例(uic.loadUi(ui_file,self)):) 当然不能保证一切都会有效,但我很惊讶这个黑客让它发挥作用。