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