我目前正在尝试解决动态调整像素图大小的问题,我在QMainWindow的一角有一个QLabel,当我改变图片时,从两侧被两个不同的QSplitters包围,它通过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))
编辑:我对其进行了更多的测试,似乎pixmap做出了反应,但只有一次宽度或高度减半。
从这个陈述来看,"当 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
. 我不确定这是否适用于 QLabels,因为您尝试进行的任何更改都可能在下次更改像素图时被撤消。
将您的 QLabel 替换为直接从 QWidget 子类化的自定义小部件。 通用 QWidget 没有最小大小,因此您的问题就消失了。 您需要编写一个小函数来在控件中设置新的 pixmap,这将需要一个 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))
现在尝试更改h
和w
.
如果您遇到任何问题,请在下面发表评论。
🅿 🆈🆀🆃