1. 程式人生 > >Qt重寫paintEvent方法遇到的問題

Qt重寫paintEvent方法遇到的問題

背景:最近在推進先進軟體開發技術大作業的過程中,需要在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);