如何在一个.ui文件中用另一个.ui文件中的控件填充空的widget?

2 投票
1 回答
2108 浏览
提问于 2025-04-17 22:56

假设我有一个 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 里有两个(其实是三个)小部件。为了举个例子,有一个简单的标签 text_lbl,还有一个空的部件 sub_widget。这两个小部件都放在 central_widget 里。

我们还有一个 SubWidget.ui 文件。SubWidget.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 的实例放到 MainWindowsub_widget 里。对我来说,最明显的做法就是在 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

如果你不能使用小部件推广,或者出于其他原因不想使用,那么最简单的解决办法就是把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)

撰写回答