不同的Qt窗口行为取决于loadUi的使用方式

时间:2016-03-02 22:21:35

标签: python qt pyqt

在使用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>

如果我们运行它,这将生成一个带有组合框的窗口,但是在调整窗口大小时,组合框始终保持相同的大小:

enter image description here

但是,如果我只是将loadUI行更改为::

        self.ui = loadUi('mywidget.ui', None)
        self.setLayout(self.ui.verticalLayout)

然后在调整窗口小部件时调整组合窗口小部件的大小:

enter image description here

为什么会发生这种情况?有什么区别:

        self.ui = loadUi('mywidget.ui', None)
        self.setLayout(self.ui.verticalLayout)

        self.ui = loadUi('mywidget.ui', self)

? (只是为了澄清,在我的情况下,所需的行为是组合框通过窗口调整大小的情况)

我在PySide上看到了同样的问题,所以这表明这是预期的行为,但有人可以解释这两种情况之间的区别吗?

1 个答案:

答案 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) 的第二个参数传递的对象中。因此loadUiself.ui最终成为完全相同的对象。

但是这段代码:

self

返回ui类的新实例(没有父级)。

但是,这些都与调整子窗口小部件的大小无关。这不能按预期工作的原因是,在Qt Designer中,您没有在顶级窗口小部件上设置布局(即 self.ui = loadUi('mywidget.ui', None) )。如果您这样做,第一个示例将正常工作。

(请注意,在ScatterWidget窗口小部件上设置布局是不够的 - 顶级窗口小部件也必须有自己的布局。