首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QPainter与QStyleSheets的Qt反混叠

QPainter与QStyleSheets的Qt反混叠
EN

Stack Overflow用户
提问于 2016-03-30 11:11:30
回答 2查看 2.9K关注 0票数 0

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

这项工作是在PyQt4 (Python: 2.7.11+/Qt: 4.8.7/PyQt4: 4.11.4)中完成的。但是,我使用PyQt5和C++ Qt4 4/Qt5实现了相同的结果。

我用来绘制左QWidget的代码是

代码语言:javascript
复制
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()

正确的小部件上使用的样式表是

代码语言:javascript
复制
setStyleSheet( "border-radius: 10px; border: 1px solid black; background: black;" )

为什么两者之间存在差异,尤其是QStyleSheet绘制的圆角部分比QPainter绘制的圆角部分要平滑得多,尽管使用了QPainter.HighQualityAntialiasing呈现提示?您可以只使用QPainter.AntialiasingQPainter.TextAntialiasing,但情况仍然没有改善。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-11 20:54:57

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

代码语言:javascript
复制
painter.setPen( QPen(Qt.black, 1) )

编辑:--我刚刚找到了我的一些旧代码,为QLabel实现了圆角边框。我被迫纠正了QRect的钢笔宽度,否则我得到了同样丑陋的结果。实现被放置在自定义样式中;阴影颜色被设置为适当的框架颜色:

代码语言:javascript
复制
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();
}
票数 2
EN

Stack Overflow用户

发布于 2020-03-16 16:14:18

我只是碰到了同样的问题。当我在没有边框的情况下画的时候,它看起来很好,但是用边框画的时候,它看起来很糟糕。Qt论坛上针对您问题的回答确实解决了这个问题。边框被绘制在控件的边界矩形之外,并且正在被裁剪。通过将我的矩形的宽度和高度减少2倍于笔宽,为left+right和top+bottom上的边框留出空间,一切看起来都好起来了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36307095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档