Название: 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
Спасибо всем! Помогло.
|