• 7128阅读
  • 6回复

[提问]QPainter导致程序crash [复制链接]

上一主题 下一主题
离线绿茶盖儿
 

只看楼主 倒序阅读 楼主  发表于: 2014-12-14
我的环境:Win7 + QT5.4
我的目的:在界面上放一个可以画图的Widget
我的做法:1. 自己写了一个QWidget的派生类PainterWidget,并根据自己的需求实现其paintEvent函数
                  2. 在界面上放一个QWidget控件,然后把该控件提升为PainterWidget类
我的问题:程序可以运行,但是当我对主界面进行大小调整,或者将主界面最小化等操作时,都会导致主程序crash,如下图所示


离线玛鲁

只看该作者 1楼 发表于: 2014-12-14
给人的感觉是对象不见了
离线kimtaikee

只看该作者 2楼 发表于: 2014-12-15
这点信息不足以分析你的问题,崩溃了是由于无限调用paintEvent造成的,上完整代码。

离线绿茶盖儿

只看该作者 3楼 发表于: 2014-12-16
回 kimtaikee 的帖子
kimtaikee:
这点信息不足以分析你的问题,崩溃了是由于无限调用paintEvent造成的,上完整代码。

  1. // CAPainter.h
  2. #ifndef CAPAINTER_H
  3. #define CAPAINTER_H
  4. #include <QPainter>
  5. #include <QPaintEvent>
  6. class CAPainter: public QWidget{
  7. public:
  8.     CAPainter(QWidget * parent = 0, Qt::WindowFlags f = 0);
  9.     ~CAPainter();
  10. private:
  11.     QPainter* m_pPainter;
  12.     QRect     m_rect;
  13.     QPaintEvent *m_paintEvent;
  14. public:
  15.     bool DrawRectangle(int x, int y, int w, int h);
  16. private:
  17.     void paintEvent(QPaintEvent *event);
  18. };
  19. #endif // CADRAWGRID_H

  1. // CAPainter.cpp
  2. #include <QWidget>
  3. #include "CAPainter.h"
  4. CAPainter::CAPainter(QWidget * parent, Qt::WindowFlags f)
  5.     : QWidget(parent, f), m_pPainter(NULL)
  6. {
  7.     m_pPainter = new QPainter();
  8. }
  9. CAPainter::~CAPainter()
  10. {
  11.     if(m_pPainter != NULL) delete m_pPainter;
  12. }
  13. void CAPainter::paintEvent(QPaintEvent *event)
  14. {
  15.     m_pPainter->begin(this);
  16.     m_pPainter->setPen(QColor(Qt::black));
  17.     m_pPainter->setBrush(QBrush(Qt::black, Qt::SolidPattern));
  18.     m_pPainter->drawRect(m_rect);
  19. }
  20. bool CAPainter::DrawRectangle(int x, int y, int w, int h)
  21. {
  22.     m_rect.setRect(x, y, w, h);
  23.     paintEvent(0);
  24.     return true;
  25. }

  1. // CAModel.cpp 调用CAPainter类
  2. #include "camodel.h"
  3. #include "ui_camodel.h"
  4. CAModel::CAModel(QWidget *parent) :
  5.     QMainWindow(parent),
  6.     mainUI(new Ui::CAModel)
  7. {
  8.     mainUI->setupUi(this);
  9.     mainUI->CAPainterWidget->DrawRectangle(10,10,16,16); // 调用CAPainter类画一个矩形
  10. }
  11. CAModel::~CAModel()
  12. {
  13.     delete mainUI;
  14. }


离线dbzhang800

只看该作者 4楼 发表于: 2014-12-16
paintEvent() 不该直接调用。

你需要正常写你的paintEvent,需要调用时,调用 update() 或 repaint()
离线绿茶盖儿

只看该作者 5楼 发表于: 2014-12-19
回 dbzhang800 的帖子
dbzhang800:paintEvent() 不该直接调用。
你需要正常写你的paintEvent,需要调用时,调用 update() 或 repaint() (2014-12-16 09:08) 

调用update还是会出同样的问题
离线dbzhang800

只看该作者 6楼 发表于: 2014-12-19
回 绿茶盖儿 的帖子
绿茶盖儿:调用update还是会出同样的问题 (2014-12-19 00:14) 

我前面说了两句,第一句是:正确编写你的paintEvent()。一般都是在里面创建QPainter对象,像你这样写,不写end()就不对了。
快速回复
限100 字节
 
上一个 下一个