QPainter 与 QStyleSheets 的 Qt 抗锯齿
Qt Antialiasing with QPainter versus QStyleSheets
这里有两个 QWidget
漆成黑色。左边 QWidget
的绘画是使用 QPainter
执行的(覆盖 ::paintEvent(...)
)。正确的小部件是 "painted" 使用 QStyleSheet
。
这项工作是在 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.HighQualityAntialiasing
渲染提示,却比QPainter
绘制的圆润得多?您可以只使用 QPainter.Antialiasing
或 QPainter.TextAntialiasing
,但情况仍然没有改善。
通过使用颜色初始化 QPen
你 select 一支笔(以及边框)的宽度为 0;我的猜测是您应该将其设置为样式表中的 1 px 以获得相同的结果。尝试
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();
}
我刚 运行 遇到了同样的问题。当我在没有边框的情况下绘制时看起来不错,但是有边框时它看起来很糟糕。 Qt 论坛中对您问题的 answer 确实解决了问题。边框被绘制在控件的边界矩形之外并被裁剪。通过将我的矩形的宽度和高度减少 2 倍的笔宽,为左+右和上+下的边框提供 space,一切看起来又好了。
这里有两个 QWidget
漆成黑色。左边 QWidget
的绘画是使用 QPainter
执行的(覆盖 ::paintEvent(...)
)。正确的小部件是 "painted" 使用 QStyleSheet
。
这项工作是在 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.HighQualityAntialiasing
渲染提示,却比QPainter
绘制的圆润得多?您可以只使用 QPainter.Antialiasing
或 QPainter.TextAntialiasing
,但情况仍然没有改善。
通过使用颜色初始化 QPen
你 select 一支笔(以及边框)的宽度为 0;我的猜测是您应该将其设置为样式表中的 1 px 以获得相同的结果。尝试
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();
}
我刚 运行 遇到了同样的问题。当我在没有边框的情况下绘制时看起来不错,但是有边框时它看起来很糟糕。 Qt 论坛中对您问题的 answer 确实解决了问题。边框被绘制在控件的边界矩形之外并被裁剪。通过将我的矩形的宽度和高度减少 2 倍的笔宽,为左+右和上+下的边框提供 space,一切看起来又好了。