Russian Qt Forum
Сентябрь 30, 2024, 16:32 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Painter стирает все что было до него. Как сделать, что бы не стирал?  (Прочитано 4200 раз)
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() ;
}
Спасибо за внимание!
« Последнее редактирование: Январь 05, 2009, 23:01 от AAXEE » Записан
Dendy
Гость
« Ответ #1 : Январь 05, 2009, 23:21 »

Всё что рисуется на окне - временный буфер. Для постоянного создайте QPixmap и рисуйте на нём, а саму пиксмапу рисуете на окне в paintEvent().
Записан
AAXEE
Гость
« Ответ #2 : Январь 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
Записан
BRE
Гость
« Ответ #3 : Январь 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() ;
}
 
« Последнее редактирование: Январь 06, 2009, 14:40 от BRE » Записан
AAXEE
Гость
« Ответ #4 : Январь 06, 2009, 16:05 »

Спасибо всем!
Помогло.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.221 секунд. Запросов: 20.