首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >不同的Qt窗口行为取决于loadUi的使用方式

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

Stack Overflow用户
提问于 2016-03-02 22:21:35
回答 1查看 332关注 0票数 0

在使用PyQt4 (和PySide)时,在使用.ui文件并使用loadUI加载小部件大小方面,我遇到了一些令人费解的行为。请考虑以下示例:

代码语言:javascript
复制
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是:

代码语言:javascript
复制
<?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行更改为:

代码语言:javascript
复制
        self.ui = loadUi('mywidget.ui', None)
        self.setLayout(self.ui.verticalLayout)

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

为什么会发生这种事?在以下方面有何区别:

代码语言:javascript
复制
        self.ui = loadUi('mywidget.ui', None)
        self.setLayout(self.ui.verticalLayout)

代码语言:javascript
复制
        self.ui = loadUi('mywidget.ui', self)

?(为了澄清,在我的示例中,所需的行为是组合框与窗口一起调整大小的情况)

我在PySide中看到了同样的问题,因此这表明这是预期的行为,但是有人能解释一下这两种情况之间的区别吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-03 00:36:37

PyQt4. docs文档很容易回答这个问题。但要说明的是:

此代码:

代码语言:javascript
复制
    self.ui = loadUi('mywidget.ui', self)

将ui加载到作为loadUi的第二个参数传递的对象中。因此,self.uiself最终是完全相同的对象。

但是这个代码:

代码语言:javascript
复制
    self.ui = loadUi('mywidget.ui', None)

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

但是,所有这些都与子部件的大小无关。之所以不能像预期的那样工作,是因为在Qt设计器中,您没有在顶级小部件(即ScatterWidget)上设置布局。如果您这样做,第一个示例将正确工作。

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35759349

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档