Russian Qt Forum

Qt => 2D и 3D графика => Тема начата: AAXEE от Январь 05, 2009, 22:57



Название: Painter стирает все что было до него. Как сделать, что бы не стирал?
Отправлено: AAXEE от Январь 05, 2009, 22:57
Всем привет!
Делаю класс Canvas, что бы на нем можно было рисовать.
Столкнулся с такой проблемой. Если QPainterом нарисовать несколько раз, то на виджете отобразятся только последнее изменение при QPaintEvent.
Как я только не пытался это обойти. Но ничего не выходит. Подскажите куда копать.
Прилагаю код хедера
Код:
#ifndef CANVAS_H
#define CANVAS_H

#include <QImage>
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QLine>
#include <QRect>


class Canvas : public QWidget
{
   Q_OBJECT
   
protected :
   
   enum Shape { Line , Rect } ;
   Shape shape ;
   
   QBrush brush ;
   QPen pen ;
   
   QLine line ;
   QRect rect ;
   
   
   virtual void paintEvent( QPaintEvent * event )
   {
      Q_UNUSED( event ) ;
     
      QPainter painter( this ) ;
     
      painter.setBrush( brush ) ;
      painter.setPen( pen ) ;
     
      switch ( shape )
      {
         case Line :
         {
            painter.drawLine( line ) ;
            break ;
         }
         case Rect :
         {
            painter.drawRect( rect ) ;
            break ;
         }
      }
     
   } 
   
public :
   
   /*
   Canvas()
   {
   }
   */
   
   void setBrush( QBrush _brush )
   {
      brush = _brush ;
   }
   
   void setPen( QPen _pen )
   {
      pen = _pen ;
   }
   
   void drawLine( QLine _line )
   {
      shape = Line ;
      line = _line ;
      update() ;
   }
   
   void drawRect( QRect _rect )
   {
      shape = Rect ;
      rect = _rect ;
      update() ;
   }
       
} ;

#endif
И код мэйна
Код:
#include <QApplication>
#include "canvas.h"

int main( int argc , char *argv[] )
{
   QApplication app( argc , argv ) ;
   
   Canvas * canvas = new Canvas() ;
   canvas->show() ;
   
   canvas->drawLine( QLine( 0 , 0 , 10 , 10 ) ) ;               // Это
   //canvas->drawRect( QRect( 100 , 100 , 300 , 300 ) ) ;// НЕ
   canvas->setPen( QPen( Qt::red ) ) ;                            //Рисуется
   canvas->setBrush( QBrush( Qt::green ) ) ;                  //
   canvas->drawRect( QRect( 50 , 50 , 200 , 100 ) ) ;
   canvas->setBrush( QBrush( Qt::blue ) ) ;
   canvas->drawRect( QRect( 80 , 80 , 230 , 130 ) ) ;       // Рисуется только это
   
   
   return app.exec() ;
}
Спасибо за внимание!


Название: Re: Painter стирает все что было до него. Как сделать, что бы не стирал?
Отправлено: Dendy от Январь 05, 2009, 23:21
Всё что рисуется на окне - временный буфер. Для постоянного создайте QPixmap и рисуйте на нём, а саму пиксмапу рисуете на окне в paintEvent().


Название: Re: Painter стирает все что было до него. Как сделать, что бы не стирал?
Отправлено: AAXEE от Январь 06, 2009, 14:30
Теперь рисовал на QPixmap, но все так же.
Код:
#ifndef CANVAS_H
#define CANVAS_H

#include <QPixmap>
#include <QWidget>
#include <QPainter>
#include <QPen>
#include <QBrush>
#include <QLine>
#include <QRect>


class Canvas : public QWidget
{
   Q_OBJECT
   
protected :
   
   QPixmap pix ;
   
   enum Shape { Line , Rect } ;
   Shape shape ;
   
   QBrush brush ;
   QPen pen ;
   
   QLine line ;
   QRect rect ;
   
   
   virtual void paintEvent( QPaintEvent * event )
   {
      Q_UNUSED( event ) ;
     
      QPainter painter ;
      painter.begin( &pix ) ;
     
      painter.setBrush( brush ) ;
      painter.setPen( pen ) ;
     
      switch ( shape )
      {
         case Line :
         {
            painter.drawLine( line ) ;
            break ;
         }
         case Rect :
         {
            painter.drawRect( rect ) ;
            break ;
         }
      }
      painter.end() ;
     
      QPainter wPainter ;
      wPainter.begin( this ) ;
      wPainter.drawPixmap( 0 , 0 , pix ) ;
      wPainter.end() ;
   } 
   
public :
   
   Canvas()
   {
   pix = QPixmap(500,500) ;
   }
   
   void setBrush( QBrush _brush )
   {
      brush = _brush ;
   }
   
   void setPen( QPen _pen )
   {
      pen = _pen ;
   }
   
   void drawLine( QLine _line )
   {
      shape = Line ;
      line = _line ;
      update() ;
   }
   
   void drawRect( QRect _rect )
   {
      shape = Rect ;
      rect = _rect ;
      update() ;
   }
       
} ;

#endif


Название: Re: Painter стирает все что было до него. Как сделать, что бы не стирал?
Отправлено: BRE от Январь 06, 2009, 14:36
Рисовать на QPixmap нужно в drawLine и drawRect.
А в paintEvent выводить QPixmap.
Код
C++ (Qt)
void drawLine( QLine _line )
{
   QPainter p( pix );
   p.drawLine( _line );
   update() ;
}
 
virtual void paintEvent( QPaintEvent * event )
{
     QPainter wPainter ;
     wPainter.begin( this ) ;
     wPainter.drawPixmap( 0 , 0 , pix ) ;
     wPainter.end() ;
}
 


Название: Re: Painter стирает все что было до него. Как сделать, что бы не стирал?
Отправлено: AAXEE от Январь 06, 2009, 16:05
Спасибо всем!
Помогло.