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

时间:2019-05-14 07:03:42

标签: c++ qt drawing qpainter

我正在开发一个类似于画家的小型应用程序。我希望我的应用程序具有允许用户绘制点,然后按绘制点的顺序将它们与线连接的功能。我也希望将我的观点画在线条之上。这是我尝试实现的方法:

 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);
    }

    /...
}

除了线条和点的颜色会融合在一起(在命名法上不确定)外,它可以按预期工作。下面的图片说明了问题所在。 enter image description here 对可能的解决方案有任何想法吗?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

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

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

    • 在B和C之间绘制线<-将在B处的椭圆上方绘制
    • 在B和C处绘制椭圆<-将在B处重新绘制椭圆
  • 迭代3:p1 = C,p2 = D

    • 在C和D之间绘制线<-将在C处的椭圆上方绘制
    • 在C和D处绘制椭圆<-将在C和D处重新绘制椭圆

您绘制了两个椭圆,它们之间的线的起点。您会看到的是由于混叠(在另一个答案中提到)和第二行下方绘制的第一个椭圆所造成的伪影。

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

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);
        }
    }
};