c++ - QPainter::begin: Widget painting can only begin as a result of a paintEvent -


the code works following warning message while press mouse while executing: ??

qpainter::begin: widget painting can begin result of paintevent qpainter::setpen: painter not active qpainter::drawrects: painter not active 

added modification further down


#include <qtextedit>  class qtexteditenter : public qtextedit {     q_object public:     qtexteditenter(qwidget *_parent);  protected:     virtual void paintevent(qpaintevent *_event);     void mousepressevent(qmouseevent *evt);     int m_color;     void mousedoubleclickevent(qmouseevent *e); signals:     void signalpressenter(); }; 

#include "qtexteditenter.h" #include <qpainter.h> #include <qmouseevent>  qtexteditenter::qtexteditenter(qwidget *_parent) :     qtextedit(_parent) {     this->setframestyle(qframe::sunken);     m_color = 0;     setattribute(qt::wa_paintoutsidepaintevent, true); }   void qtexteditenter::paintevent(qpaintevent *_event) {     qpainter pnt( viewport() );     pnt.setpen( qcolor( 255, 0, 0, 0xff ));     pnt.drawrect( 0, 0, width()-1, height()-1); }   void qtexteditenter::mousepressevent(qmouseevent *e) {     qpainter p(this->viewport());     p.setpen(qcolor(0,0,0,0xff));     p.drawrect(this->viewport()->rect());     p.begin(this);      switch(m_color){         case 0:             p.setpen(qt::red);             break;         case 1:             p.setpen(qt::green);             break;     }     p.drawellipse(e->pos(),2,2);     p.end(); }  void qtexteditenter::mousedoubleclickevent(qmouseevent *e) {     m_color++;     if (m_color > 1) m_color = 0;  } 

------------------- modified ----------------

void qtexteditenter::paintevent(qpaintevent *_event) {      if(1){         qpainter pnt( this->viewport());          pnt.setpen( qcolor( 0xff, 0, 0, 0xff ));         pnt.drawrect( 0, 0, width()-1, height()-1);          pnt.setpen( qcolor( 0, 0xff, 0, 0xff ));         pnt.drawrect( 10, 10, width()-20, height()-20);     }      if(flagmodify == 1){         qpainter p(this->viewport());          switch(m_color){             case 0:                 p.setpen(qt::red);                 break;             case 1:                 p.setpen(qt::green);                 break;         }          p.begin(this);         p.drawellipse(x, y, 2, 2);         p.end();          flagmodify = 0;     } }   void qtexteditenter::mousepressevent(qmouseevent *e) {     x = e->pos().x();     y = e->pos().y();      flagmodify = 1;     this->update(this->rect()); } 

you message because painting widget's paint device allowed inside paint event. if use outside paint event, there's no guarantee work. so, instead of painting inside mousepressevent, set state variable (e.g. ispressed) , call update, passing widget's rect. trigger paint event, can check state variable , paint widget accordingly.


Comments

Popular posts from this blog

php - Calling a template part from a post -

Firefox SVG shape not printing when it has stroke -

How to mention the localhost in android -