您正在覆盖
绘画,“覆盖”意味着你
忽视
默认行为。
的默认行为
paintEvent()
对标准Qt小部件的修改会导致绘制该小部件(无论是按钮、标签、组框等)。如果你只是覆盖它,那个小部件就会
从不
涂漆,
除非
super().paintEvent(event)
).
例如,考虑以下因素:
class RightGroup(QGroupBox):
pass
这将正确显示正常的分组框。
现在,这个:
class RightGroup(QGroupBox):
def paintEvent(self, event):
pass
不会显示任何内容,因为您明确忽略了默认的绘制行为。要“还原”此,请执行以下操作:
而且
添加自定义图形:
class RightGroup(QGroupBox):
def paintEvent(self, event):
super().paintEvent(event)
qp = QPainter(self)
qp.drawRect(self.rect().adjusted(0, 0, -1, -1)
注意:除非使用抗锯齿且笔宽小于或等于0.5,否则应始终将对象矩形的右/下边缘限制为小于或等于笔宽一半的整数。这就是
adjusted(0, 0, -1, -1)
在上面对于你上面的代码,它应该是
QRectF(0, 0, self.width() - 1, self.height() - 1)
也就是说,你可能想画画
在…内
因此,更好的解决方案是为
目录
在该groupbox中,将其添加到groupbox,并替代该子类的绘制事件。
class MainWindow(QWidget):
def __init__(self, *args, **kwargs):
# ...
rightGroup = QGroupBox('Right Group')
self.layout.addWidget(rightGroup, 0, 1)
rightLayout = QVBoxLayout(rightGroup)
rightLayout.addWidget(Canvas())
class Canvas(QWidget):
def __init__(self):
super().__init__()
self.path = QPainterPath()
def mousePressEvent(self, event):
if event.button() == Qt.LeftButton:
self.path.moveTo(event.pos())
def mouseMoveEvent(self, event):
# note: here we use "buttons", not "button".
if event.buttons() == Qt.LeftButton:
self.path.lineTo(event.pos())
self.update()
def mouseReleaseEvent(self, event):
self.update()
def paintEvent(self, event):
painter = QPainter(self)
painter.setRenderHints(painter.Antialiasing)
painter.setPen(QPen(Qt.black, .5, Qt.SolidLine))
painter.drawRect(self.rect())
painter.drawPath(self.path)