2014-03-07 60 views
1

我有一個包含查看器(顯示Pixmaps的自定義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_()) 

所以這裏的代碼只是使用的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中的spinbox和滑塊,以及一個QLabel(我後來將其設置爲我的SpriteViewer類,它是QLabel的子類。這是一個問題 - 每個Sprite都有不同的大小,我希望SpriteViewer根據。SpriteLabel的大小

+1

如果沒有看到.ui文件(加上任何可能直接相關的代碼),這幾乎是不可能的。 – ekhumoro

+0

謝謝,我會嘗試儘快上傳最小案例。我希望有一些簡單的答案,例如在內部小部件的大小發生變化時調用layout.update()類型的東西。 –

回答

1

我解決了這一問題 - 只是跟進所以這個問題是不是半途而廢

我沒能理解如何促進小部件在Qt Designer中工作,所以在這條線:

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

我已經將self.sv分配給一個全新的SpriteLabel(它不是佈局的一部分),所以resi它對佈局沒有影響。相反,我不得不使用Designer中的「Promote to」上下文菜單來指示它是一個SpriteLabel,然後將分配保留給UI文件。

相關問題