Qt圆角矩形,为什么角落不同?

vri*_*nce 6 c++ qt qt4 rasterizing

我尝试drawRoundedRect直接用方法绘制一个圆形矩形QPixmap(没有渲染引擎涉及这里exept纯Qt一个...),我仔细检查矩形的大小与我的pixmap的大小:

Pixmap : QSize(50, 73) 
Rectangle: QRect(0,0 48x11) 
Run Code Online (Sandbox Code Playgroud)

看到充足的空间......

编辑:一些代码

pixmap = QPixmap(50,73); //example size that match my case
QRectF rect(0,0,48,11);

QPainter painter(&pixmap);
painter.setRenderHint(QPainter::TextAntialiasing);
painter.setWorldMatrixEnabled(false);
painter.setPen(QPen()); //no pen
painter.setBrush(QBrush(color));
painter.drawRoundedRect(rect, 2.0, 2.0);
Run Code Online (Sandbox Code Playgroud)
  • 我禁用了世界转型......
  • 我将集合转换为统一...
  • 我尝试了几个半径(1.0,2.0,3.0,4.0)......
  • 我换笔宽,刷颜色......

但它始终以4个不同角落的直线结束!像那样 :

x和y的半径= 3.0

我直接将pixmap输出到一个文件,以确保我在显示期间没有刮它...相同的形状.

有人知道Qt圆形矩形半径小吗?我很久以前就看到过这个问题,但我并不清楚如何处理它!

Ste*_*e S 14

看起来你没有使用抗锯齿(即QPainter::Antialiasing渲染提示).这是一个没有它的Qt怪癖.从我所看到/听到的,Qt开发人员并不十分关心修复这个问题(大多数人都想要反抗锯齿).

解决方法(除了使用抗锯齿之外)是用QPainter::drawLine()和自己绘制矩形QPainter::drawArc().你可能不得不玩数字,直到看起来正确 - 直接计算往往会出现一两个像素.此外,您可能会发现,即使使用此方法,右下角也不会与其他角完全相同.

如果你感觉有点雄心勃勃,你可以尝试解决这个并向Qt提交补丁.

更新:在Qt 5中改变了圆弧绘制结果.根据我的经验,这是一个很大的改进.

  • 我玩antialising其他方式绘制东西(drwa路径,弧...).用这么小的东西进行抗锯齿是值得的!而我最好的镜头是addind~0.5每一个quessing在哪里可以产生奇怪的行为...所以我会接受**玩数字**方法! (2认同)
  • 有同样的问题.使用`QPainter p(this); p.setRenderHint(QPainter的::抗锯齿); p.setRenderHint(QPainter :: HighQualityAntialiasing);`为我做了诀窍. (2认同)

Jac*_*ieg 5

我知道这是一个老问题,但对于Qt5调用的用户来说setRenderHint(QPainter::Qt4CompatiblePainting);似乎QPainter可以解决问题。

编辑:

我找到了一个生成完美圆角矩形和边框颜色的解决方案,它看起来与QPushButton's border 使用的圆角矩形相同。这就是我实现paintEvent此目标的方法:

void MyButtonGroup::paintEvent(QPaintEvent * e)
{
    int borderSize = 5;
    QColor borderColor = Qt::red;
    QColor backgroundColor = Qt::blue;
    int borderRadius = 3;

    QPen pen;
    pen.setWidth(borderSize);
    pen.setColor(borderColor);

    QPainter painter(this);
    painter.setRenderHint(QPainter::Antialiasing);
    painter.setPen(pen);

    QRectF rect(rect().x() + borderSize / 2,
                rect().y() + borderSize / 2,
                rect().width() - borderSize,
                rect().height() - borderSize);


    if(borderSize % 2 == 0)
    {
        painter.drawRoundedRect(rect,
                                borderSize,
                                borderSize);
    }
    else
    {
        painter.drawRoundedRect(rect.translated(0.5, 0.5),
                                borderRadius,
                                borderRadius);
    }

    QBrush brush(backgroundColor);
    pen.setBrush(brush);
    painter.setBrush(brush);

    if(borderSize % 2 == 0)
    {
        painter.drawRoundedRect(rect,
                                borderRadius,
                                borderRadius);
    }
    else
    {
        painter.drawRoundedRect(rect.translated(0.5, 0.5),
                                borderRadius,
                                borderRadius);
    }

    QWidget::paintEvent(e);
}
Run Code Online (Sandbox Code Playgroud)

我发布此内容是因为我发现实现此结果有点困难:

在此输入图像描述