2011-02-28 79 views
1

我正在學習Qt,我想在小部件上隨機繪製線條並繼續追加新行。下面的代碼在paintEvent中每當在窗口小部件上調用更新時都會繪製一條隨機線,但當paintEvent被調用時,如何停止窗口部件清除之前繪製的線?有沒有什麼辦法只是附加繪製的對象?Qt繪圖行

很明顯,我可以存儲所有的行並重新繪製它們,但是這對我將用這個應用程序執行的操作似乎沒有必要。

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(); 
} 

回答

1

您可以在離屏表面上繪製線條,並在繪畫事件中將它們繪製到小部件。 A 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實例,根據需要添加行,然後在繪製事件處理程序中繪製路徑。我不熟悉畫家的路徑。所以,我不確定性能如何與以前的方法相比。

+0

這似乎工作,但它在全尺寸窗口上很慢,因爲它必須基本上覆制整個屏幕。重繪數百/數千行比較好。當我有機會時,我也會試試QPainterPath。 – user623879 2011-02-28 07:59:01

0

autoFillBackground設置爲false。如果設置,則調用paintEvent之前它正在擦除(填充背景顏色)。

0

或者,插入命令

this->setAttribute(Qt::WA_NoSystemBackground, bool) ; 

之前調用

this->update() ; 

布爾=真 - 離開油漆區的完整和允許 新項目將被添加到油漆區。

bool = false - 在繪製項目前擦除繪畫區域。

0

每次您想要創建下一行時,您都可以創建QGraphicsLineItem (link)對象並將其添加到QGraphicsScene (link)窗口小部件。

請注意,在此解決方案中,您必須既不關心重新繪製線條,也不必在退出程序時銷燬它們,因爲QGraphicsScene將處理這兩種操作。