2016-07-05 98 views
0

我想绘制我的自定义按钮,其尺寸为20x20像素。我创建了一个继承QPushButton的类,我已覆盖的paintEvent方法有下面这段代码:PySide QPainter.drawRect()与QBrush偏移问题

painter = QtGui.QPainter(self) 

x = self.rect().x() 
y = self.rect().y() 

width = self.rect().width() 
height = self.rect().height() 

painter.setBrush(QBrush(QColor(170, 97, 112))) 
painter.drawRect(x, y, width, height) 

这是我所得到的(在Photoshop中编辑):

enter image description here

你可以清楚地看到左上角的x和y尺寸都有1个像素偏移量。

我想知道为什么会发生这种情况。我可以通过从x和y中提取1个像素并将1个像素添加到宽度和高度来消除此问题,因此它们的值为:x = -1; y = -1;宽度= 21;身高= 21.

但是,这只是让我感到奇怪。我不知道这是否是Qt的问题(或者仅仅是PySide),或者我不明白。

+0

幽州您的自定义按钮是在20×20规模以上但图像显示了一个矩形22×22。那么上面图片的哪一部分实际上是*您的*按钮? –

+0

@ G.M。不,它实际上是20x20。我用红色笔刷标记了按钮(从0到20)。图像本身就是这样裁剪的。对不起,如果这是以任何方式混淆。 – Makal

回答

1

我觉得你对QPainter::drawRect究竟做了什么感到困惑。从QPainter documentation

用当前笔和画笔绘制当前矩形。

该矩形填充了当前笔刷,并用当前笔画出轮廓。考虑到这一点,我怀疑当你打电话给QPainter::drawRect时,你有一支笔可以让画家看到灰色的轮廓。

如果你想要的是填充矩形,那么你可以使用...

painter = QtGui.QPainter(self) 
painter.fillRect(this->rect(), QBrush(QColor(170, 97, 112))) 
+0

是的,所以事实证明我必须声明“清除笔”QPen(QColor(0,0,0,0),1,QtCore.Qt.SolidLine)'并将其提供给QPainter,否则如果我没有设置任何笔为QPainter它将使用它自己的默认(灰色1px固体)。 – Makal

+0

@Makal你知道空笔吗?如果你不想要笔,也许这就是你想要的。 –

+0

@KubaOber那么,我从来没有听说过“空笔”这个词,但如果你的意思是QPen(QtCore.Qt.NoPen),那么我已经将这行与我以前的“清晰笔”交换过了 - 工作原理相同,只是更短。 – Makal