在PyQt5中从.ui文件导入自定义小部件

3
我希望能够通过直接导入.ui文件使用由QtCreator创建的自定义小部件。 目前,当我使用pyuic5创建.py文件时,我的代码可以正常工作。但我想要能够直接从.ui文件导入我的小部件。 以下是一些有效的代码:

main.py

import MyWidget

MainWindowUI, MainWindowBase = uic.loadUiType('main.ui')

class mainGUIWindow(MainWindowUI, MainWindowBase):
     def __init__(self, mainWindow):
         QtWidgets.QMainWindow.__init__(self)
         self.setupUi(self)

         self.myWidget = MyWidget.Ui_Form()
         self.myWidget.setupUi(self)

通过使用pyuic5 -x MyWidget.ui -o MyWidget.py生成的MyWidget.py文件。

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(271, 201)
        # The rest of the widget is down here

有没有使用LoadUi()或类似方法避免使用pyuic的方式?到目前为止,我尝试过以下方法:

main.py

class mainGUIWindow(MainWindowUI, MainWindowBase):
    def __init__(self, mainWindow):
        QtWidgets.QMainWindow.__init__(self)
        self.setupUi(self) # contains a QFrame called 'frame'

        # Creation of myWidget
        self.wid = myWidget()

        # Adding myWidget to a layout
        hbox = QtWidgets.QHBoxLayout()
        hbox.addWidget(self.wid)
        self.frame.setLayout(hbox)


class myWidget(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        uic.loadUi('MyWidget.ui', self)

当我尝试将我的小部件添加到主窗口的布局中时,我会收到以下错误:

QWidget::setLayout: 试图在已经具有布局的 QFrame“frame” 上设置 QLayout“”,

这意味着您正在尝试为已经拥有布局的 QFrame 设置新布局。您需要先删除现有的布局,然后再设置新布局。

1
看一下这个链接:https://dev59.com/knE95IYBdhLWcg3wPbZ7。他们使用的是PyQt4,但在PyQt5中也是一样的。 - GPhilo
我编辑了我的帖子以展示我尝试过的内容。我可以在main.py文件中创建一个Widget类,但我无法将其正确添加到主窗口中。 - Gwendal Grelier
请查看这里的新错误(似乎与您的第一个问题无关):https://dev59.com/v18e5IYBdhLWcg3wssPG - GPhilo
1个回答

6

我找到了一个解决方案,虽然对我来说不是最理想的,但我认为它可以帮助其他人。 在这个小部件的__init__()期间,我不得不创建一个新类,该类继承自PyQt5.QtWidgets.QWidget,并调用loadUi()函数以捕获widget.ui文件。

class mainGUIWindow(MainWindowUI, MainWindowBase):
    def __init__(self, mainWindow):
        QtWidgets.QMainWindow.__init__(self)
        self.setupUi(self)

        wid = myWidget()

        self.grid = QtWidgets.QGridLayout()
        self.grid.addWidget(wid,0,0)
        self.frame.setLayout(self.grid)


class myWidget(QtWidgets.QWidget):
    def __init__(self):
        QtWidgets.QWidget.__init__(self)
        uic.loadUi('Widget1.ui', self)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接