Qt重寫paintEvent方法遇到的問題

2022-08-29 01:15:09 字數 1199 閱讀 1823

背景:最近在推進先進軟體開發技術大作業的過程中,需要在qt的某個控制項(widget)中繪製乙個2d圖形,該widget位於tabwidget的某乙個tab內,如圖所示。

在qt的子控制項widget中利用qpaint類繪製圖形,需要定義乙個新的類,該類繼承自qwidget,並且需要在這個新的類中重寫paintevent()方法。自定義類的標頭檔案和cpp檔案如下:

#ifndef drawprogressbar_h

#define drawprogressbar_h#include

"qwidget.h

"class drawprogressbar : public

qwidget

;#endif

//!drawgrogressbar_h

#include "

drawprogressbar.h

"#include

"qwidget.h

"#include

"qpainter.h

"drawprogressbar::drawprogressbar(qwidget *parent) : qwidget(parent)

void drawprogressbar::paintevent(qpaintevent *event

)drawprogressbar::~drawprogressbar()

問題:在程式中呼叫類中paintevent()方法時問題出現了——其繪製的圖形只能出現在子控制項左上角 50 x 300 的位置上。

原因:利用自定義的paintevent()函式繪圖時,畫布大小並不是子控制項的大小,這時需要在paintevent()函式中將畫布的大小進行調整。

解決方案:可以將子控制項的高度和寬度(width、height)值通過建構函式傳入自定義的類,並在paintevent()函式中調整畫布大小,這樣就完美解決了!

//

設定畫布大小

setfixedheight(mheight);

setfixedwidth(mwidth);

QT 視窗重繪事件 paintEvent事件

1 qwidget qscrollview viewport const 返回滾動檢視中的視口視窗部件,這個視窗部件包含內容視窗部件或者要畫的區域。2 void qwidget paintevent qpaintevent 虛 保護 只要視窗部件需要被重繪就被呼叫。每個要顯示輸出的視窗部件必須實現它...

05 方法重寫

在繼承關係中,子類如果定義了乙個與父類方法簽名完全相同的方法,被稱為覆寫 override 加上 override可以讓編譯器幫助檢查是否進行了正確的覆寫。例如,在person類中,我們定義了run 方法 class person 在子類student中,覆寫這個run 方法 class stude...

關於使用JSPatch重寫setter方法

本部落格遷移來自 今天出錯的是oc 針對 setmodel function model model model的處理時,我當時從jspatch的issue中看到有人說使用 self.origsetmodel model 即可,當時也沒有驗證,就一直這麼用。前幾天文章中提到的修復swift bug中...