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