【问题标题】:Building a QT Designer Layout including a variable-sized widget构建包含可变大小小部件的 QT Designer 布局
【发布时间】:2014-03-08 01:49:38
【问题描述】:

我有一个类,它包含一个查看器(一个显示像素图的自定义 QLabel)和它下方的按钮,用于滚动浏览可用的图像(大小不同)。

我希望按钮立即出现在图像下方,这意味着每次图像更改时它们都需要移动。但是,当加载更大的图像时,它只会覆盖按钮。如何在 QT 设计器中进行设置以避免这种情况?我认为将查看器和按钮放入 QVBoxLayout 就足够了,但是当 QLabel 调整大小时,整个布局的大小不会。我已经尝试了很长一段时间的尺寸政策,但我一定无法理解一些东西。

编辑 - 这是我仅显示所需的最少代码和 UI 文件的尝试。

from sprite_viewer_ui import Ui_SpriteViewer

class SpriteViewer(QWidget, Ui_SpriteViewer):

    def __init__(self,parent = None):
        super(SpriteViewer,self).__init__(parent)
        self.setupUi(self)

        self.session = Session()

        self.sv = SpriteLabel(self.session,parent=self)
        self.setupSession(self)

    def setupSession(self):
        #Update the slider and spinbox with the new range
        self.spriteSlider.setRange(1,self.session.getNumSprites())
        self.spritePicker.setRange(1,self.session.getNumSprites())

        #Show the initial sprite
        self.sv.showSprite(1)
        self.spriteSlider.setValue(1)

        #Make connections
        self.spriteSlider.valueChanged.connect(self.session.setSprite)
        self.session.spriteChanged.connect(self.sv.showSprite)

if __name__ == "__main__":
    a = QApplication(sys.argv)

    se = SpriteViewer()
    se.show()

    sys.exit(a.exec_())

所以这里的代码只是使用 UI 来构建一个基本界面,其中包含一个查看器 sv 以及一个旋转框和滑块来显示使用了哪个精灵。 ui文件为:

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>SpriteViewer</class>
 <widget class="QWidget" name="SpriteViewer">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>658</width>
    <height>420</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Form</string>
  </property>
  <layout class="QVBoxLayout" name="verticalLayout">
   <property name="sizeConstraint">
    <enum>QLayout::SetDefaultConstraint</enum>
   </property>
   <item>
    <widget class="QLabel" name="sv">
     <property name="minimumSize">
      <size>
       <width>640</width>
       <height>360</height>
      </size>
     </property>
     <property name="text">
      <string/>
     </property>
    </widget>
   </item>
   <item>
    <layout class="QHBoxLayout" name="horizontalLayout">
     <item>
      <widget class="QSlider" name="spriteSlider">
       <property name="maximum">
        <number>0</number>
       </property>
       <property name="orientation">
        <enum>Qt::Horizontal</enum>
       </property>
       <property name="tickPosition">
        <enum>QSlider::TicksBelow</enum>
       </property>
       <property name="tickInterval">
        <number>30</number>
       </property>
      </widget>
     </item>
     <item>
      <widget class="QSpinBox" name="spritePicker">
       <property name="maximum">
        <number>0</number>
       </property>
      </widget>
     </item>
    </layout>
   </item>
  </layout>
 </widget>
 <resources/>
 <connections>
  <connection>
   <sender>spriteSlider</sender>
   <signal>valueChanged(int)</signal>
   <receiver>spritePicker</receiver>
   <slot>setValue(int)</slot>
   <hints>
    <hint type="sourcelabel">
     <x>562</x>
     <y>361</y>
    </hint>
    <hint type="destinationlabel">
     <x>587</x>
     <y>362</y>
    </hint>
   </hints>
  </connection>
  <connection>
   <sender>spritePicker</sender>
   <signal>valueChanged(int)</signal>
   <receiver>spriteSlider</receiver>
   <slot>setValue(int)</slot>
   <hints>
    <hint type="sourcelabel">
     <x>594</x>
     <y>361</y>
    </hint>
    <hint type="destinationlabel">
     <x>540</x>
     <y>363</y>
    </hint>
   </hints>
  </connection>
 </connections>
</ui>

我意识到这是一场噩梦。但基本上它是 QHBoxLayout 中的一个旋转框和一个滑块,以及一个 QLabel(我后来将其设置为我的 SpriteViewer 类,它是 QLabel 的子类。这是问题所在 - 每个精灵的大小不同,我希望 SpriteViewer 根据SpriteLabel 的大小。

【问题讨论】:

  • 如果没有看到 .ui 文件(加上任何可能直接相关的代码),这几乎是不可能回答的。
  • 谢谢,我会尽快上传一个最小的案例。我希望有一些简单的答案,比如当内部小部件的大小发生变化时调用一些 layout.update() 类型的东西。

标签: python pyqt


【解决方案1】:

我解决了这个问题 - 只是跟进,所以问题不会不完整。

我无法理解提升的小部件在 QT Designer 中是如何工作的,所以在这一行:

self.sv = SpriteLabel(self.session,parent=self)

我已将 self.sv 分配给一个全新的 SpriteLabel(它不是布局的一部分),因此调整它的大小对布局没有影响。相反,我必须使用 Designer 中的“提升到”上下文菜单来指示它是 SpriteLabel,然后将分配留给 UI 文件。

【讨论】:

    猜你喜欢
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    相关资源
    最近更新 更多