簡體   English   中英

QWidget的paintEvent()滯后應用程序

[英]QWidget's paintEvent() lagging application

我正在研究和修改冰箱磁鐵的示例,而我試圖做的最后一件事是繪制一些應該在背景上的標簽和線條。

環顧四周試圖弄清楚如何繪制標簽和線條之后,我了解到可以重寫QWidget的paintEvent()來做到這一點。 但是,在完成此操作之后,應用程序變得很遲鈍,我發現這是因為paintEvent()在看似無限的循環中被調用。

為了找出解決方法,我將繪制標簽和行的代碼移到了類的構造函數中。 但是,只有標簽被繪制在應用程序上。 在那之后,我將標簽留在了構造函數中,但是將繪制線條的代碼移回了paintEvent()。 它可以正常工作,按預期方式繪制線條,並且僅在拖動內容時才調用paintEvent()。

為什么沒有在構造函數上繪制線條,為什么paintEvent()陷入無限循環?

這是應該繪制標簽和線條的代碼段:

QPen pen(Qt::lightGray, 0, Qt::SolidLine, Qt::SquareCap, Qt::RoundJoin);
QPainter paint(this);
paint.setPen(pen);
int scale = 20;
for(int x=0; x<25; x++){
    QString timetext= "0"+QString::number(x)+":00";
    QLabel *time= new QLabel(timetext,this);
    time->move(x*scale,2);
    time->show();
    paint.drawLine(x*scale,12,x*scale,400);
}

您需要在paintEvent()期間將對象添加到小部件樹。 那被認為是失敗的。 Qt損壞和繪制的調度程序將看到必須繪制一個新的孩子,並嘗試對其進行管理,並且很可能是循環的結果。 如果您覆蓋paintEvent(),請在同一對象中進行所有繪制! 黃金法則: paintEvent()僅用於繪畫! 不用於創建對象或其他任何東西。

像這樣做:

QFont font(painter.font());
font.setBold(true);
painter.setFont(font);
painter.fillRect(rect(), Qt::black);
painter.setPen(Qt::white);
painter.drawText(rect(), Qt::AlignCenter, tr("White text on dark background. Awesome."));

為什么沒有在構造函數上繪制線條?

我認為是的,但是下一次對paintEvent()的調用將它們“擦除”了,在該調用中您不再畫線了……

為什么paintEvent()陷入無限循環?

我認為這可能與您的time-> show();有關; 每次調用paintEvent都會被調用25次...我不確定,但是由於作為窗口小部件的父對象,當您調用“ show”時,也許它在其父對象上調用了“ show”,因此觸發了paintEvent。 ... 你知道我的意思...

既然,Ypnos給您一個解決方案,我指的是他:)

暫無
暫無

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

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