在使用PyQt4 (和PySide)时,在使用.ui文件并使用loadUI加载小部件大小方面,我遇到了一些令人费解的行为。请考虑以下示例:
import os
from PyQt4 import QtGui
from PyQt4.uic import loadUi
class Widget(QtGui.QWidget):
def __init__(self, parent=None):
super(Widget, self).__init__(parent=parent)
self.ui = loadUi('mywidget.ui', self)
class MainTest(QtGui.QWidget):
def __init__(self, parent=None):
super(MainTest, self).__init__(parent=parent)
self.layout = QtGui.QVBoxLayout()
self.setLayout(self.layout)
def add_widget(self):
self.layout.addWidget(Widget())
app = QtGui.QApplication([])
main = MainTest()
main.show()
main.add_widget()
app.exec_()其中mywidget.ui是:
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>ScatterWidget</class>
<widget class="QWidget" name="ScatterWidget">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>287</width>
<height>230</height>
</rect>
</property>
<widget class="QWidget" name="option_dashboard" native="true">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<widget class="QComboBox" name="xAxisComboBox">
</widget>
</item>
</layout>
</widget>
</widget>
<resources/>
<connections/>
</ui>如果运行此操作,这将生成一个带有组合框的窗口,但当调整窗口大小时,组合框始终保持相同的大小:

但是,如果我简单地将loadUI行更改为:
self.ui = loadUi('mywidget.ui', None)
self.setLayout(self.ui.verticalLayout)然后,在调整小部件大小时调整组合件的大小:

为什么会发生这种事?在以下方面有何区别:
self.ui = loadUi('mywidget.ui', None)
self.setLayout(self.ui.verticalLayout)和
self.ui = loadUi('mywidget.ui', self)?(为了澄清,在我的示例中,所需的行为是组合框与窗口一起调整大小的情况)
我在PySide中看到了同样的问题,因此这表明这是预期的行为,但是有人能解释一下这两种情况之间的区别吗?
发布于 2016-03-03 00:36:37
PyQt4. docs文档很容易回答这个问题。但要说明的是:
此代码:
self.ui = loadUi('mywidget.ui', self)将ui加载到作为loadUi的第二个参数传递的对象中。因此,self.ui和self最终是完全相同的对象。
但是这个代码:
self.ui = loadUi('mywidget.ui', None)返回ui类的新实例(它没有父类)。
但是,所有这些都与子部件的大小无关。之所以不能像预期的那样工作,是因为在Qt设计器中,您没有在顶级小部件(即ScatterWidget)上设置布局。如果您这样做,第一个示例将正确工作。
(请注意,仅在option_dashboard小部件上设置布局是不够的--顶级小部件也必须有自己的布局)。
https://stackoverflow.com/questions/35759349
复制相似问题