使用QT Designer和PyQt,如何使用另一个.ui文件中定义的窗口小部件填充一个.ui文件中定义的空窗口小部件?

时间:2014-03-19 09:38:56

标签: python qt pyqt

我们说MainWindow.ui定义了MainWindow.py的布局,其中MainWindow.py看起来有点像这样:

class MainWindow(QtGui.QMainWindow):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = uic.loadUi('MainWindow.ui')

MainWindow.ui拥有两个(实际上是三个)小部件。一个简单的QLabel text_lbl用于论证,一个空的QWidget sub_widget。这两个小部件保存在central_widget

我们还有SubWidget.uiSubWidget.ui可以是任何东西,真的,但是我们说它拥有很多标签和旋转盒。 SubWidget.py看起来很像MainWindow.py,除了它包含很多信号和插槽:

class SubWidget(QtGui.QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)
        self.ui = uic.loadUi('SubWidget.ui')

        # A lot of interesting stuff here.

我想要做的是在SubWidget的sub_widget中添加MainWindow的实例。对我来说,显而易见的事情是将以下代码行添加到MainWindow.py' __init__

from SubWidget import SubWidget  # Though really this shouldn't be in
                                     # __init__, but you get the idea.
self.ui.sub_widget = SubWidget()

这根本不起作用。我最终在主窗口的内容上渲染了SubWidget ,并抱怨MainWindow已经有了布局,但我在所有摆弄中丢失了代码。

我如何实现这一目标?

编辑:我忘了提。 self.ui.central_layout.addWidget(SubWidget())直观地实现了我尝试做的事情,但是如果我决定在.ui文件中添加UI元素,那么它就不会起作用。

1 个答案:

答案 0 :(得分:0)

如果您不能或出于任何原因而不想使用小部件促销,那么最明显的解决方案是让SubWidget成为占位符小部件的子级

由于占位符小部件还没有孩子,你不能在Qt Designer中给它布局,所以你必须以编程方式完成所有这些:

    layout = QtGui.QVBoxLayout(self.ui.empty_widget)
    layout.setContentsMargins(0, 0, 0, 0)
    self.ui.sub_widget = SubWidget()
    layout.addWidget(self.ui.sub_widget)