问题描述
我尝试实现我自己的按钮小部件,它显示图像而不是文本。它工作正常,但小部件不尊重图像的纵横比。我见过的大多数解决方案都使用 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())
当按钮第一次出现时,纵横比是正确的,但在调整窗口大小时,按钮将完全独立地水平和垂直拉伸。
我正在寻找一种解决方案:
- 仍然允许调整小部件的大小(即我想避免
QSizePolicy.Fixed
);和 - 使用标准布局管理器(即我想避免在包含小部件中使用自定义
QLayout
子类)
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)