背景:最近在推進先進軟件開發技術大作業的過程中,需要在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 : public QWidget { 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()函數中將畫布的大小進行調整。
解決方案: 可以將子控件的高度和寬度(width、height)值通過構造函數傳入自定義的類,並在paintEvent()函數中調整畫布大小,這樣就完美解決了!
//設置畫布大小 setFixedHeight(mheight); setFixedWidth(mwidth);
