构建包含可变大小小部件的QT Designer布局
我有一个类,里面有一个查看器(一个自定义的 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 的大小来调整。
1 个回答
1
我解决了这个问题 - 只是想跟进一下,以免这个问题没有得到完整的回答。
我之前没搞懂QT Designer里“提升小部件”的工作原理,所以在这一行:
self.sv = SpriteLabel(self.session,parent=self)
我把self.sv赋值给了一个全新的SpriteLabel(这个新标签并不在布局里),所以调整它的大小对布局没有任何影响。其实我应该在Designer里使用“提升为”这个右键菜单,告诉它这是一个SpriteLabel,然后让UI文件来处理这个赋值。