簡體   English   中英

通過分割器動態調整標簽中的PyQt5 Pixmap

[英]PyQt5 Pixmap in Label dynamic resize via Splitter

我目前正在嘗試解決動態調整Pixmap大小的問題,我在QMainWindow的一個角上有一個QLabel,當我更改圖片時,它的兩側被兩個不同的QSplitter包圍着,並使用KeepAspectRatio按標簽的大小對其進行縮放。 兩個分離器還通過信號連接到一個功能,該功能再次縮放像素圖以使其盡可能適合。

我遇到的問題是,當像素圖已經適合所有可用空間時,我無法弄清楚如何減小尺寸,因為那時分離器剛剛停止工作。

這是像素圖設置:

self.picture_field.setStyleSheet("border: 4px solid")
self.pixmap = QPixmap('dandelion.jpg')
self.picture_field.setAlignment(Qt.AlignCenter) 
self.picture_field.setPixmap(self.pixmap.scaled(self.picture_field.width()-8, 
self.picture_field.height()-8, Qt.KeepAspectRatio))

-8必須因為邊框而在那兒,如果缺少它,則每次更改時小部件都會變大

Qsplitter之一:

right_splitter = QSplitter(Qt.Vertical)
right_splitter.addWidget(self.picture_field)
right_splitter.addWidget(self.person_field)
right_splitter.splitterMoved.connect(self.dynamic_scaling)

Person_field是簡單的QTreeView

動態縮放功能:

def dynamic_scaling(self):
    self.picture_field.setPixmap(self.pixmap.scaled(self.picture_field.width()-8, self.picture_field.height()-8, Qt.KeepAspectRatio))

編輯:我測試了一點,似乎像素映射作出反應,但只有一次寬度或高度減半。

從此聲明來看,“我無法弄清楚當像素圖已經適合所有可用空間時如何減小尺寸,因為那時候分離器才停止工作”,我想我知道問題出在哪里。 每個QWidget都有一個最小大小,可以通過函數QWidget.minimumSize 根據經驗,我知道QSplitter尊重其子級的最小尺寸,並且不允許用戶將窗扇移動到迫使一個子級采用小於其最小尺寸的位置。

您說拆分器的一個子級是QLabel。 通過設計,QLabel對自己的尺寸要求非常聰明。 例如,如果更改QLabel的文本,它將自動重新計算其大小值並觸發重新布局。 我認為如果您更改Pixmap,它也會做同樣的事情,盡管我自己還沒有嘗試過。 關鍵是QLabel的最小大小會隨着內容的變化而變化。

由於QLabel的動態大小調整以及QSplitter拒絕允許子小部件違反其最小尺寸,因此拆分器可能看起來“卡住了”並阻止您縮小它的尺寸。

要解決此問題,您需要使QLabel的最小尺寸很小,例如(1,1)。 有幾種方法可以做到這一點。 由於我沒有您完整的應用程序,因此無法確定哪一個最適合您。

子類QLabel並重寫minimumSize以返回(0,0)這非常簡單。

將QLabel對象的大小策略設置為QSizePolicy.Ignore 有關功能QWidget.SetSizePolicy請參閱文檔。

使用函數QWidget.SetMimimumSize 我不確定這對QLabels是否有效,因為您嘗試進行的任何更改都可能在您下次更改像素圖時撤消。

將QLabel替換為直接從QWidget子類化的自定義窗口小部件 通用QWidget沒有最小大小,因此您的問題就消除了。 您將需要編寫一個小函數以在控件中設置一個新的像素圖,這將需要一個paint事件處理程序。

我希望這些方法之一對您有用(並且我已經正確理解了問題)。

嘗試:

w = QtGui.Qlabel.width();
h = QtGui.Qlabel.height();

#set a scaled pixmap to a w x h window keeping its aspect ratio 
QtGui.Qlabel.setPixmap(p.scaled(w, h, Qt.KeepAspectRatio))

現在嘗試更改hw

如果您有任何問題,請在下面評論。

🅿🆈🆀🆃

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM