我正在学习Qt,我想在小部件上随机绘制线条并继续追加新的线条。每当在窗口小部件上调用更新时,下面的代码在paintEvent中绘制一个随机行,但是当调用paintEvent时,如何阻止窗口小部件清除先前绘制的行?有没有办法只追加绘制的对象?
显然我可以存储所有行并每次重新绘制它们,但这对于我将使用此应用程序所做的事情似乎是不必要的。
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::black, 2));
painter.drawLine(QPointF(qrand() % 300, qrand() % 300), QPointF(qrand() % 300,qrand() % 300));
}
void MainWindow::on_b_toggleDrawing_triggered()
{
this->update();
}
答案 0 :(得分:1)
您可以在屏幕外的表面上绘制线条,并将它们blit绘制到paint事件中的小部件中。 QImage是理想的,因为它是QPaintDevice,可以使用QPainter::drawImage绘制。下面的代码段假定this->image
是指向与MainWindow大小相同的QImage的指针。
void MainWindow::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawImage(this->rect, *this->image);
}
void MainWindow::on_b_toggleDrawing_triggered()
{
QPainter painter(this->image);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setPen(QPen(Qt::black, 2));
painter.drawLine(QPointF(qrand() % 300, qrand() % 300),
QPointF(qrand() % 300,qrand() % 300));
this->update();
}
另一种方法是使用QPainterPath构建路径。在这种情况下,您只需维护一个QPainterPath实例,根据需要添加行,然后在paint事件处理程序中绘制路径。我对画家的路径并不熟悉。所以,我不确定性能与之前的方法相比如何。
答案 1 :(得分:0)
将autoFillBackground
设为false。如果设置,则在调用paintEvent
之前擦除(填充背景颜色)。
答案 2 :(得分:0)
或者,插入命令
this->setAttribute( Qt::WA_NoSystemBackground, bool ) ;
之前打电话
this->update() ;
bool = true - 保留油漆区域并允许 要添加到绘画区域的新项目。
bool = false - 在绘制项目之前擦除绘画区域。
答案 3 :(得分:0)
每次要创建下一行时,您都可以创建一个QGraphicsLineItem
(link)对象并将其添加到QGraphicsScene
(link)小部件中。
请注意,在此解决方案中,您不得不在重新排序时不打扰行,也不必在退出程序时将其销毁,因为QGraphicsScene
将处理这两个操作。