코드가 작동하지만 마우스가 실행되는 동안 다음 경고 메시지가 표시됩니다. ??QPainter :: begin : 위젯 페인팅은 paintEvent의 결과로만 시작할 수 있습니다.
QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::setPen: Painter not active
QPainter::drawRects: Painter not active
는 --- ------------------- 더 아래
#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;
}
를 변형 수정 첨가 -------------
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());
}
오류는이 문제를 분명하게 설명합니다. paintEvent 함수로 렌더링하는 대신 p.begin을 사용하여 mousePressEvent를 그립니다. 작동하는 것처럼 보일 수 있지만 나중에 문제가 발생할 수 있습니다. 성능면에서는 확실합니다. 마우스를 눌렀을 때 객체가 페인트되게하려면 윈도우의 업데이트 기능을 사용하여 객체가 자체를 다시 칠할 필요가 있음을 알립니다. – TheDarkKnight
수정이 추가되었지만 같은 오류 – jdl