Qt中在线条上方绘制椭圆时的颜色合并问题

Color merge problem upon drawing ellipses above lines in Qt

我正在开发类似画家的小型应用程序。我希望我的应用程序具有一项功能,允许用户绘制点,然后按照绘制点的顺序将它们与线连接起来。我还希望将我的点绘制在线上方。以下是我正在努力实现这一目标的方法:

 void ImageViewer::on_linesAct_triggered()
{
    QPainter paint(objectpix);
    QPen LinePen (QColor(255-pointcolor[currentset-1].red(),255-pointcolor[currentset-1].green(),255-pointcolor[currentset-1].blue()));
    LinePen.setWidth(5);

    for(int i=0;i<count[currentset-1]-1;i++)
    {
        paint.setPen(LinePen);
        QPoint p1(static_cast<int>(round(tableX[i][currentset-1])),static_cast<int>(round(tableY[i][currentset-1])));
        QPoint p2(static_cast<int>(round(tableX[i+1][currentset-1])), static_cast<int>(round(tableY[i+1][currentset-1])));
        paint.drawLine(p1,p2);
        paint.setPen(QPen(pointcolor[currentset-1]));
        paint.setBrush(QBrush(pointcolor[currentset-1],Qt::SolidPattern));
        paint.drawEllipse(p1,2,2);
        paint.drawEllipse(p2,2,2);
    }

    /...
}

除了线和点的颜色有点合并(不确定命名法)之外,它按预期工作。下面的图片说明了这个问题。 对可能的解决方案有什么想法吗?

我认为您可以尝试为画家设置一个 rendering hint,使用 QPainter::setRenderHint,例如:

QPainter paint(objectpix);
paint.setRenderHint(QPainter::Antialiasing);

如果您考虑点列表 [A、B、C、D] 和您的代码:

  • 迭代 1:p1 = A,p2 = B

    • 在 A 和 B 之间画线
    • 在A点和B点画椭圆
  • 迭代 2:p1 = B,p2 = C

    • 在 B 和 C 之间画线 <-- 将在 B 处的椭圆上方画线
    • 在 B 和 C 处画椭圆 <-- 将 re-draw B 处的椭圆
  • 迭代 3:p1 = C,p2 = D

    • 在 C 和 D 之间画线 <-- 将在 C 处的椭圆上方画线
    • 在 C 和 D 处画椭圆 <-- 将 re-draw C 处的椭圆

你画了两次椭圆,它们之间有一条线的起点。您可以看到由于别名(如另一个答案中提到的)和第二行下方绘制的第一个椭圆造成的伪像。

最简单的方法是使用两个循环:

class MyWidget: public QWidget
{
public:
    MyWidget(): QWidget()
    {}
    virtual void paintEvent(QPaintEvent* ev) override
    {
        QVector<QPoint> pointcolor;
        pointcolor << QPoint(10, 12) << QPoint(40, 60) << QPoint(70, 20) << QPoint(100, 100);
        QPainter paint(this);
        paint.setRenderHint(QPainter::Antialiasing);
        QPen LinePen (Qt::red);
        LinePen.setWidth(5);

        for(int i = 1;i != pointcolor.length();++i)
        {
            paint.setPen(LinePen);
            QPoint p1 = pointcolor.at(i - 1);
            QPoint p2 = pointcolor.at(i);
            paint.drawLine(p1,p2);
        }

        // Draw the points above the lines
        paint.setPen(Qt::green);
        paint.setBrush(Qt::green);
        for(QPoint const& point: pointcolor)
        {
            paint.drawEllipse(point,2,2);
        }
    }
};