Label中的PyQt5 Pixmap通过Splitter动态调整大小

时间:2017-07-13 13:58:12

标签: python pyqt qt5 pyqt5

我目前正试图解决动态调整Pixmap大小的问题,我在QMainWindow的一个角落有一个QLabel,当我改变图片时,两面被两个不同的QSplitters包围,它被KeepAspectRatio的标签大小缩放。两个分离器也与信号连接到一个函数,该函数再次缩放像素图以尽可能多地适合。

我遇到的问题是,当pixmap已经适合所有可用空间时,我无法弄清楚如何能够减小尺寸,因为此时分割器只是停止工作。

这是像素图设置:

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必须在那里因为边界,如果它缺失,小部件会随着每次更改而变大

其中一个Qsplitters:

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))

编辑:我测试了一下,看起来,像素图反应,但只有一次宽度或高度减半。

2 个答案:

答案 0 :(得分:1)

从这句话判断,“当pixmap已经适合所有可用空间时,我无法弄清楚如何减小尺寸,因为那时分离器只是停止工作”,我想我知道问题是什么。每个QWidget都有一个最小尺寸,可通过函数QWidget.minimumSize获得。根据经验,我知道QSplitter尊重其孩子的最小尺寸,并且不允许用户将窗扇移动到一个位置,这会迫使其中一个孩子的尺寸小于其最小尺寸。

你说分裂者的一个孩子是QLabel。根据设计,QLabels对自己的尺寸要求非常聪明。例如,如果更改QLabel的文本,它将自动重新计算其大小值并触发重新布局。我认为如果你改变了Pixmap它会做同样的事情,虽然我自己没有尝试过。关键是QLabel的最小尺寸随着内容的变化而变化。

由于QLabel的动态调整大小以及拒绝QSplitter允许子窗口小部件违反其最小尺寸,分割器可能会“卡住”并阻止您缩小它。

要解决这个问题,你需要让QLabel的最小尺寸非常小,比如说(1,1)。有几种方法可以做到这一点。由于我没有完整的应用程序,我无法确定哪一个最适合您。

子类QLabel并覆盖minimumSize以返回(0,0)这非常简单。

将QLabel对象的大小政策设置为QSizePolicy.Ignore 。请参阅函数QWidget.SetSizePolicy的文档。

使用功能QWidget.SetMimimumSize 。我不确定这对QLabel是否有效,因为下次更改像素图时,您尝试进行的任何更改都可能会被撤消。

将QLabel替换为直接从QWidget 创建子类的自定义窗口小部件。通用QWidget没有最小尺寸,因此您的问题就会消失。您需要编写一个小函数来将一个新的pixmap设置到您的控件中,这将需要一个paint事件处理程序。

我希望其中一种方法适合您(并且我已正确理解问题)。

答案 1 :(得分:0)

试试:

['T', 'h', 'a', 'n', 'k', 's']

现在尝试更改ru

如果您在下面发表任何问题评论。