我正在开发一个类似于画家的小型应用程序。我希望我的应用程序具有允许用户绘制点,然后按绘制点的顺序将它们与线连接的功能。我也希望将我的观点画在线条之上。这是我尝试实现的方法:
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);
}
/...
}
除了线条和点的颜色会融合在一起(在命名法上不确定)外,它可以按预期工作。下面的图片说明了问题所在。 对可能的解决方案有任何想法吗?
答案 0 :(得分:1)
我认为您可以尝试使用QPainter::setRenderHint
为画家设置rendering hint,例如:
QPainter paint(objectpix);
paint.setRenderHint(QPainter::Antialiasing);
答案 1 :(得分:1)
如果考虑点[A,B,C,D]的列表和代码:
迭代1:p1 = A,p2 = B
迭代2:p1 = B,p2 = C
迭代3:p1 = C,p2 = 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);
}
}
};