如何使用PyQt4.uic.loadUi将第二个.ui加载到self中?

时间:2016-05-30 14:40:25

标签: python pyqt4 pyqt5

我正在创建一个加载几个.ui文件的应用程序。第一个是QMainWindow类型,其他类型是QWidget类型。

我无法弄清楚如何将第二个用户界面(module.ui)加载到自我中,从而可以通过self.<widget_name>访问小部件。

如何实现这一目标?

from PyQt4 import QtGui
from PyQt4 import uic


class TestApp(QtGui.QMainWindow):
    def __init__(self):
        super(TestApp, self).__init__()

        # Load main window and the module
        uic.loadUi('main_window.ui', self)  # QMainWindow, contains testLayout, loads into self
        ui_module = uic.loadUi('module.ui')  # QWidget

        # Attach module to main window
        self.testLayout.addWidget(ui_module)  # this works fine

        # Edit widget in UI module
        self.label.setText('Hello')  # does not work (since self.label doesn't exist)

我可以这样做:

self.label = ui_module.label
self.label.setText('Hello')

...但我想从一开始就将UI加载到自己身上。

如果我尝试将UI加载到self中,我会收到错误:

uic.loadUi('module.ui', self)
>>> QLayout: Attempting to add QLayout "" to TestApp "Form", which already has a layout

1 个答案:

答案 0 :(得分:2)

您需要创建一个小部件来将ui文件加载到

self.widget = QWidget(self)
uic.loadUi('module.ui', self.widget)

self.widget.label.setText('Hello')

话虽如此,如果你为另一个小部件创建一个单独的类,可能会更好。

class MyWidget(QWidget):
    def __init__(self, **args, **kwargs):
        super(MyWidget, self).__init__(*args, **kwargs)
        uic.loadUi('module.ui', self)
        self.label.setText('Hello')

class TestApp(QtGui.QMainWindow):
    def __init__(self):
        ...
        self.widget = MyWidget(self)