保持纵横比的 PyQt 可调整大小的小部件

问题描述

我尝试实现我自己的按钮小部件,它显示图像而不是文本。它工作正常,但小部件不尊重图像的纵横比。我见过的大多数解决方案都使用 heightForWidth 方法解决这个问题,但这对我不起作用。

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from .button import ImageButton,ImageRadioButton


class ImageButton(QPushButton):
    def __init__(self,image,*args,hover_highlight=True,**kw):
        super().__init__(*args,**kw)
        
        self.pixmap = Qpixmap(image)
        self.size = self.pixmap.size()

        sp = QSizePolicy(QSizePolicy.Preferred,QSizePolicy.Preferred)
        sp.setHeightForWidth(True)
        self.setSizePolicy(sp)

    def paintEvent(self,e):
        super().paintEvent(e)
        QPainter(self).drawpixmap(e.rect(),self.pixmap)

    def sizeHint(self):
        return self.size

    def heightForWidth(self,w):
        return self.size.height() * w // self.size.width()


class ImageRadioButton(ImageButton):
    def __init__(self,**kw)
        self.setCheckable(True)
        self.setAutoExclusive(True)


app = QApplication(sys.argv)
w = QMainWindow()

main_panel = QWidget()
w.setCentralWidget(main_panel)
vBox = QVBoxLayout(main_panel)
b1 = ImageButton(r'path/to/image.png')
b2 = ImageButton(r'path/to/image.png')
b2.setCheckable(True)
b3 = ImageRadioButton(r'path/to/image.png')
b4 = ImageRadioButton(r'path/to/image.png')
vBox.addWidget(b1)
vBox.addWidget(b2)
vBox.addWidget(b3)
vBox.addWidget(b4)

w.show()

sys.exit(app.exec())

当按钮第一次出现时,纵横比是正确的,但在调整窗口大小时,按钮将完全独立地水平和垂直拉伸。

我正在寻找一种解决方案:

  1. 仍然允许调整小部件的大小(即我想避免 QSizePolicy.Fixed);和
  2. 使用标准布局管理器(即我想避免在包含小部件中使用自定义 QLayout 子类)

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)