뷰어 (Pixmap을 표시하는 커스텀 QLabel)와 그 아래에있는 버튼을 사용하여 사용 가능한 이미지 (다른 크기)를 스크롤합니다.가변 크기 위젯을 포함한 QT 디자이너 레이아웃 작성하기
단추가 이미지 바로 아래에 나타나기를 원합니다. 즉, 이미지가 바뀔 때마다 이동해야합니다. 그러나 더 큰 이미지를로드 할 때는 단추 위로 덮어 씁니다. 이를 피하기 위해 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_())
그래서 코드는 여기에 단지 사용되는 스프라이트 보여 뷰어
sv
과 spinbox와 슬라이더를 기본 인터페이스를 구축하기 위해 UI를 사용합니다. 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 (QLabel은 하위 클래스 인 QLabel에 나중에 설정됩니다.)이 문제는 모든 스프라이트가 다른 크기이므로 SpriteViewer가 . SpriteLabel의 크기
.ui 파일 (직접 관련있는 모든 코드 포함)을 보지 않으면 대답하기가 거의 불가능합니다. – ekhumoro
감사합니다. 가능한 한 빨리 최소 사례를 업로드하려고 노력할 것입니다. 내부 위젯의 크기가 변경되면 layout.update()를 호출하는 것과 같은 쉬운 대답이 있었으면합니다. –