PyQt5中无法将继承QAbstractButton的Card添加至布局的问题求助
我之前也碰到过一模一样的问题,核心原因是QAbstractButton的子类如果没有重写sizeHint()和minimumSizeHint()方法,布局管理器无法确定控件的默认尺寸,最终导致控件被压缩到完全不可见。
问题分析
当你不使用布局直接显示Card控件时,可能是窗口尺寸足够大,或者控件自身通过绘制逻辑隐含了尺寸,但布局管理器会严格依赖控件的sizeHint()返回值来分配空间。QAbstractButton的默认sizeHint()并不适配你自定义的卡片尺寸,所以布局给Card分配的空间几乎为0,自然看不到。而QPushButton已经内置了合适的sizeHint()实现,所以能正常显示。
解决方案
在你的Card类中添加以下两个方法,明确告诉布局管理器卡片的默认尺寸:
from PyQt5.QtCore import QSize class Card(QAbstractButton): def __init__(self, rank=None, suit=None, parent=None): super().__init__(parent) self.rank = rank self.suit = suit self.visibility = False # 添加这两个关键方法 def sizeHint(self): return QSize(CARD_WIDTH, CARD_HEIGHT) def minimumSizeHint(self): return self.sizeHint() # 你的其他原有方法保持不变 def paintEvent(self, e): painter = QPainter() painter.begin(self) if self.visibility == True: self.draw_card_front(painter) else: self.draw_card_back(painter) painter.end() def draw_card_back(self, painter): painter.setPen(COLOR_OUTLINE) painter.setBrush(COLOR_BACK) painter.drawRoundedRect(0, 0, CARD_WIDTH-1, CARD_HEIGHT-1, 10, 10) def draw_card_front(self, painter): painter.setPen(COLOR_OUTLINE) painter.setBrush(COLOR_FRONT) painter.drawRoundedRect(0, 0, CARD_WIDTH-1, CARD_HEIGHT-1, 10, 10) self.draw_rank(painter) self.draw_suit(painter) # ... 剩余方法省略
额外说明
sizeHint()返回控件的首选尺寸,布局管理器会优先参考这个值来分配空间minimumSizeHint()返回控件的最小尺寸,确保布局不会把控件压缩到比这个尺寸更小- 你的
parent设置没有问题,布局管理器在添加控件时会自动调整控件的父对象,不需要为此担心
修改后重新运行代码,就能在布局中正常看到两张卡片了。
内容的提问来源于stack exchange,提问作者calcium3000
相关产品推荐
相关产品推荐

