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
Post a Comment