簡體   English   中英

Qt paintEvent崩潰了

[英]Qt paintEvent crashes

我試圖在我的小部件上繪制簡單的板。

當我試圖自動化時,我的paintEvent崩潰了。 我認為它是由for循環引起的,我是對的嗎? 如何以其他方式繪畫?

void Widget::paintEvent(QPaintEvent *event)
{
QPixmap myPix( QSize(20,20) );
QPainter painter(this);
for(int i = 0; i < 100; i+5){
    painter.drawLine(QPointF(i,0),QPointF(i,max));
}
this->setPixmap(myPix);
}

你的for循環不正確並導致程序崩潰(我確定這不是你的錯)。 它應該寫成這樣:

for(int i = 0; i < 100; i+=5){
    p.drawLine(QPointF(i,0),QPointF(i,max));
}

分配增量。 這樣它就可以完成工作並正確完成。

另外,我建議使用drawPixmap()而不是setPixmap() 但是setPixmap()不會導致無限遞歸,例如下一代碼正常工作。

//...
this->setPixmap(QPixmap("G:/2/qt.jpg"));
QLabel::paintEvent(event);

為什么? 使用這種方法永遠不會產生無限遞歸(見這里 ):

如果在一個本身可以從paintEvent()調用的函數中調用repaint(),則可能會得到無限遞歸。 update()函數永遠不會導致遞歸。

的確, setPixmap()調用update() ,而不是repaint() 要證明看到源代碼:

setPixmap源碼:

void QLabel::setPixmap(const QPixmap &pixmap)
{
    Q_D(QLabel);
    //...
    d->updateLabel();//what it does?
}

updateLabel源碼:

void QLabelPrivate::updateLabel()
{
    Q_Q(QLabel);
    //...
    q->updateGeometry();
    q->update(q->contentsRect());//not repaint

}

正如我所說,這不是一個錯誤,但我認為如果你能用QPainter做你需要的所有東西會更好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM