背景:最近在推进先进软件开发技术大作业的过程中,需要在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);