2012-07-29 93 views
0

這發生在Qt模擬器(用於手機)。我試圖只更新一個小部件區域的一部分,但是整個小部件會被更新。試圖只更新Qt中的一個小部件的矩形,但整個小部件的區域被更新

爲了說明,下面的代碼:

void Widget::mousePressEvent(QMouseEvent *event) 
{ 
    update(0, 0, 10, 10); 
} 

void Widget::paintEvent(QPaintEvent *event) 
{ 
    qDebug() << event->rect(); 
} 

提供了以下調試輸出,當我點擊小工具:

查閱QRect(0,0 458x832)

哪是小部件的整個區域。

我在這裏做錯了什麼?


編輯

我跑在Linux上相同的代碼,和它的工作,因爲它應該,調試輸出是

查閱QRect(0,0 10×10)

+0

在iOS和MAC上遇到同樣的問題,你有沒有找到解決方案? – jjxtra 2015-01-10 01:02:23

回答

0

在我看到的大多數GUI框架中,您無法只更新應用程序窗口/小部件的某些部分。即使在API中有一些函數用於更新某個矩形,比如您正在使用的update(x,y,x,y),它只是通知Framework需要更新至少給定的矩形,並且框架可以更新屏幕的更大部分。

我不確定它是如何在手機Qt中工作的,但是在桌面版本中它是這樣做的,因爲在大多數操作系統中GUI應用程序不會在任何地方存儲它的'圖像',並且如果你最小化然後顯示你的窗口,重新創建整個表面。

所有這一切意味着你不能依賴假設,你將繪製一些東西,然後當你需要的時候你會在某個自定義矩形中添加其他繪畫操作。你應該實現一些通用的'繪畫'功能,它可以從頭開始重繪所有內容,並將繪畫優化留給框架。

0

我不熟悉手機上的Qt。但也許別的東西正在觸發整個小部件的更新。 Qt發送一個paintEvent用於在一個事件循環處理過程中調用的所有update()。所以你的代碼可能需要進行部分更新,但窗口系統中的某個地方可能會以某種方式觸及並要求完全更新。

嘗試repaint(),看看是否發送你的paintEvent的正確區域。

+0

好主意。儘管我嘗試了,但它仍然使整個區域無效。我應該檢查它是否在實際電話上具有相同的行爲。可能只是模擬器的一個怪癖。 – sashoalm 2012-07-29 20:33:00

0

事實證明,這個錯誤只存在於Qt Simulator中。在實際的電話本身上,更新區域正在正確傳遞。我通過顯示QMessageBox的座標爲event->rect來測試此項。