使用QPainter和QStyleSheets进行Qt抗锯齿处理

时间:2016-03-30 11:11:30

标签: qt4 antialiasing qpainter qtstylesheets

这是两个QWidget漆成黑色的。左QWidget上的绘画是使用QPainter执行的(覆盖::paintEvent(...))。正确的小部件使用QStyleSheet“绘制”。

enter image description here

这项工作是在PyQt4(Python: 2.7.11+/Qt: 4.8.7/PyQt4: 4.11.4)完成的。但是你使用PyQt5和C ++ Qt4 / Qt5获得了相同的结果。

我用来绘制左QWidget的代码是

def paintEvent( self, pEvent ) :

    painter = QPainter( self )
    painter.setRenderHints( QPainter.HighQualityAntialiasing )

    painter.setPen( Qt.black )
    painter.setBrush( Qt.black )

    painter.drawRoundedRect( self.rect(), 10.0, 10.0 )

    painter.end()

    pEvent.accept()

右侧小部件上使用的样式表是

setStyleSheet( "border-radius: 10px; border: 1px solid black; background: black;" )

为什么两者之间存在差异,尤其是QStyleSheet绘制的圆角部分比使用QPainter渲染提示的QPainter.HighQualityAntialiasing更圆滑得多?您可以只使用QPainter.AntialiasingQPainter.TextAntialiasing,但情况仍无法改善。

2 个答案:

答案 0 :(得分:1)

通过使用颜色初始化QPen,您可以选择笔(以及边框)宽度为0;我的猜测是你应该像样式表中那样将它设置为1像素,以获得相同的结果。尝试

painter.setPen( QPen(Qt.black, 1) )

修改:我刚刚发现了我的一些旧代码,为QLabel实现了圆形边框。我被迫纠正笔宽QRect,否则我得到了同样难看的结果。实现以自定义样式放置;阴影颜色设置为适当的帧颜色:

void MyStyle::drawControlHeaderFrame(const QStyleOptionFrameV3* option,
    QPainter* painter, const QWidget* widget) const
{
    QPalette::ColorGroup cg = QPalette::Active;

    if(!(option->state & QStyle::State_Enabled))
        cg = QPalette::Disabled;
    else if(!(option->state & QStyle::State_Active))
        cg = QPalette::Inactive;

    const int lineWidth = 2, frameAdjustment = lineWidth / 2;
    QRect rect(option->rect);
    //Adjust for pen width
    rect.adjust(frameAdjustment, frameAdjustment, -frameAdjustment, -frameAdjustment);

    QPen pen(option->palette.color(cg, QPalette::Shadow));
    pen.setWidth(lineWidth);

    painter->save();
    {
        painter->setRenderHint(QPainter::Antialiasing);
        painter->setPen(pen);
        painter->drawRoundedRect(rect, 9, 9);
    }
    painter->restore();
}

答案 1 :(得分:0)

我只是遇到了同样的问题。当我在没有边框的情况下绘画时,它看起来不错,但是在带有边框的情况下,它看起来很糟糕。在Qt论坛中,您的问题的answer确实解决了问题。边框被绘制在控件的边界矩形外部并被裁剪。通过将矩形的宽度和高度减小笔宽的2倍,在左,右和上,下边界留出空间,一切看起来都很好。