在使用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上看到了同样的问题,所以这表明这是预期的行为,但有人可以解释这两种情况之间的区别吗?
答案 0 :(得分:3)
PyQt4.uic docs可以很容易地回答这个问题。但拼出来:
此代码:
System.Web.Mail.SmtpMail.SmtpServer="SMTP Host Address";
System.Web.Mail.SmtpMail.Send("from","To","Subject","MessageText");
会将ui 加载到作为 self.ui = loadUi('mywidget.ui', self)
的第二个参数传递的对象中。因此loadUi
和self.ui
最终成为完全相同的对象。
但是这段代码:
self
返回ui类的新实例(没有父级)。
但是,这些都与调整子窗口小部件的大小无关。这不能按预期工作的原因是,在Qt Designer中,您没有在顶级窗口小部件上设置布局(即 self.ui = loadUi('mywidget.ui', None)
)。如果您这样做,第一个示例将正常工作。
(请注意,在ScatterWidget
窗口小部件上设置布局是不够的 - 顶级窗口小部件也必须有自己的布局。