2014-03-07 7 views
1

뷰어 (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의 크기

+1

.ui 파일 (직접 관련있는 모든 코드 포함)을 보지 않으면 대답하기가 거의 불가능합니다. – ekhumoro

+0

감사합니다. 가능한 한 빨리 최소 사례를 업로드하려고 노력할 것입니다. 내부 위젯의 크기가 변경되면 layout.update()를 호출하는 것과 같은 쉬운 대답이 있었으면합니다. –

답변

1

나는 문제를 해결 - 그냥 다음 그래서 질문은 남아 있지 불완전

나는 위젯, QT 디자이너에서 작업을 추진하는 방법을 이해하지 못했다이 줄에 이렇게 :

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

완전히 새로운 SpriteLabel (레이아웃의 일부가 아님)에 self.sv를 할당 했으므로 resi 그것이 레이아웃에 아무런 영향을주지 않습니다. 대신 Designer에서 "Promote to"상황에 맞는 메뉴를 사용하여 SpriteLabel임을 표시 한 다음 할당을 UI 파일까지 남겨 두어야했습니다.

관련 문제