Qt绘图线

Qt绘图线,qt,graphics,drawing,qt-creator,Qt,Graphics,Drawing,Qt Creator,我正在学习Qt,我想在一个小部件上随机画线,并继续添加新线。下面的代码在小部件上调用更新时在paintEvent中绘制一条随机线,但是在调用paintEvent时如何阻止小部件清除先前绘制的线?有没有办法只附加绘制的对象 显然,我可以存储所有的行并每次重新绘制它们,但这对于我将要使用这个应用程序所做的事情来说似乎是不必要的 void MainWindow::paintEvent(QPaintEvent *) { QPainter painter(this); paint

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

您可以在屏幕外的表面上绘制线条,并在paint事件中将其添加到小部件。A将是理想的,因为它是A,可以使用。下面的代码段假定
this->image
是指向与主窗口大小相同的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实例,根据需要添加行,然后在paint事件处理程序中绘制路径。我对画家的道路不太熟悉。因此,我不确定性能与前一种方法相比如何。

您可以在屏幕外的表面上绘制线条,并在绘制事件中将其添加到小部件。A将是理想的,因为它是A,可以使用。下面的代码段假定
this->image
是指向与主窗口大小相同的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实例,根据需要添加行,然后在paint事件处理程序中绘制路径。我对画家的道路不太熟悉。因此,我不确定性能与之前的方法相比如何。

设置为false。如果设置为false,则在调用
paintEvent
之前将擦除(填充背景色)。

设置为false。如果设置了,则在调用
paintEvent
之前将擦除(填充背景色)。

或者,插入命令

 this->setAttribute( Qt::WA_NoSystemBackground, bool ) ;
打电话之前

 this->update() ;
bool=true-保持绘制区域完好无损,并允许 要添加到绘制区域的新项目

bool=false-在绘制项目之前擦除绘制区域

或,插入命令

 this->setAttribute( Qt::WA_NoSystemBackground, bool ) ;
打电话之前

 this->update() ;
bool=true-保持绘制区域完好无损,并允许 要添加到绘制区域的新项目


bool=false-在绘制项目之前擦除绘制区域

每次要创建下一行时,都可以创建一个对象并将其添加到小部件中


请注意,在此解决方案中,您不必担心重新绘制行,也不必在退出程序时销毁行,因为
qgraphicscene
将负责这两个操作。

每次要创建下一行时,您都可以创建一个对象并将其添加到小部件中


请注意,在这个解决方案中,退出程序时,您不必担心重新绘制行或销毁行,因为
qgraphicscene
将负责这两个操作。

这似乎可行,但在全尺寸窗口中,速度相当慢,因为它基本上必须复制整个屏幕。最好只是重新绘制数百行/数千行。如果有机会,我也会尝试使用QPainterPath。这似乎可行,但在全尺寸窗口上速度相当慢,因为它必须基本上复制整个屏幕。最好只是重新绘制数百行/数千行。如果有机会,我也会尝试QPainterPath。