2016-07-14 20 views
1

我正在使用QLabel在Qt 5應用程序中繪製圖形。我安裝了一個事件過濾器,而不是繼承QLabel。事件過濾器確實被調用,並且QLabel內部的繪畫可以工作。問題是事件過濾器被遞歸調用,並且我的cpu達到100%的使用率。在QLabel中繪畫遞歸調用paintEvent

我在這裏做錯了什麼?

這裏是我的代碼:

MainWindow::MainWindow(QWidget *parent) : 
    QMainWindow(parent), 
    ui(new Ui::MainWindow) 
{ 
    ui->setupUi(this); 
    ui->label->installEventFilter(this); 
} 

bool MainWindow::eventFilter(QObject *obj, QEvent *ev) 
{ 
    if ((obj == ui->label) && (ev->type() == QEvent::Paint)) 
    { 
     QPixmap pix(50, 50); 
     pix.fill(Qt::blue); 
     ui->label->setPixmap(pix); 
    } 
    return false; 
} 

感謝您的幫助 尼莎·米勒

+0

這是嚴重問的問題!你正在問如何解決某些神祕問題的不正確的解決方案,並且你甚至沒有給出你想要解決什麼樣的問題。 –

+0

@MarekR爲什麼這個問題很嚴重? OP介紹了這個問題併發布了相關的代碼。 –

+0

就像我寫的,你在問如何解決你沒有描述的一些問題的解決方案。我很確定你是否解釋了你想要實現哪種功能,結果會更簡單一些。 –

回答

1

setPixmap()電話update()哪個隊列另一油漆事件,導致一個無限循環。

繪畫事件經常發送,應該儘可能便宜。考慮提前設置像素圖以響應信號或事件,或者重新實現QLabel及其paintEvent()

+0

啊,這解釋了遞歸,謝謝。我通過重新使用qlabel中的pixmap來解決問題,所以我不必每次都設置它。 –

+0

@NishaMiller如果這解決了您的問題,請接受答案,以便更容易地幫助他人。 –