Qt绘图线

时间:2011-02-28 06:54:28

标签: qt graphics drawing qt-creator

我正在学习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();
}

4 个答案:

答案 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将处理这两个操作。