如何在一个.ui文件中用另一个.ui文件中的控件填充空的widget?
假设我有一个 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
的实例放到 MainWindow
的 sub_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)