Qt重寫paintEvent方法遇到的問題
阿新 • • 發佈:2018-11-07
背景:最近在推進先進軟體開發技術大作業的過程中,需要在Qt的某個控制元件(widget)中繪製一個2D圖形,該widget位於TabWidget的某一個tab內,如圖所示。
在Qt的子控制元件widget中利用QPaint類繪製圖形,需要定義一個新的類,該類繼承自QWidget,並且需要在這個新的類中重寫paintEvent()方法。自定義類的標頭檔案和cpp檔案如下:
//drawpregressbar.h
#ifndef DRAWPROGRESSBAR_H #define DRAWPROGRESSBAR_H #include "qwidget.h" class Drawprogressbar : publicQWidget { public: explicit Drawprogressbar(QWidget *parent = nullptr); void paintEvent(QPaintEvent *event); ~Drawprogressbar(); }; #endif // !DRAWGROGRESSBAR_H
//drawprogressbar.cpp
#include "Drawprogressbar.h" #include "qwidget.h" #include "qpainter.h" Drawprogressbar::Drawprogressbar(QWidget*parent) : QWidget(parent) { } void Drawprogressbar::paintEvent(QPaintEvent *event) { //TODO:在此完成繪圖 } Drawprogressbar::~Drawprogressbar() { }
問題:在程式中呼叫類中paintEvent()方法時問題出現了——其繪製的圖形只能出現在子控制元件左上角 50 X 300 的位置上。
原因:利用自定義的paintEvent()函式繪圖時,畫布大小並不是子控制元件的大小,這時需要在paintEvent()函式中將畫布的大小進行調整。
解決方案:
//設定畫布大小 setFixedHeight(mheight); setFixedWidth(mwidth);