zoukankan      html  css  js  c++  java
  • 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);    
  • 相关阅读:
    Ansible命令介绍之ansible
    Ansible命令介绍
    Ansible配置文件讲解
    博客搬家。新博客地址 http://fangjian0423.github.io/
    SpringMVC源码分析系列
    MyBatis拦截器原理探究
    通过源码分析MyBatis的缓存
    ThreadLocal原理及其实际应用
    logstash搭建日志追踪系统
    Mybatis解析动态sql原理分析
  • 原文地址:https://www.cnblogs.com/SChenqi/p/9926054.html
Copyright © 2011-2022 走看看