2013-07-17 1 views
1

코드가 작동하지만 마우스가 실행되는 동안 다음 경고 메시지가 표시됩니다. ??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()); 
} 
+1

오류는이 문제를 분명하게 설명합니다. paintEvent 함수로 렌더링하는 대신 p.begin을 사용하여 mousePressEvent를 그립니다. 작동하는 것처럼 보일 수 있지만 나중에 문제가 발생할 수 있습니다. 성능면에서는 확실합니다. 마우스를 눌렀을 때 객체가 페인트되게하려면 윈도우의 업데이트 기능을 사용하여 객체가 자체를 다시 칠할 필요가 있음을 알립니다. – TheDarkKnight

+0

수정이 추가되었지만 같은 오류 – jdl

답변

6

위젯의 페인트 장치에 대한 페인팅이 페인트 이벤트 내에서만 허용되므로 메시지가 표시됩니다. 페인트 이벤트 밖에서 사용할 경우 작동한다는 보장은 없습니다. 따라서 mousePressEvent 내부에 페인팅하는 대신 상태 변수 (예 : isPressed)를 설정하고 update으로 전화하여 위젯의 rect를 전달합니다. 이렇게하면 페인트 이벤트가 트리거되어 상태 변수를 확인하고 그에 따라 위젯을 페인트 할 수 있습니다.

+0

이 수정되었지만 동일한 오류가 발생했습니다 – jdl

+2

페인트 이벤트 외부의 코드를 실행하는 것과 동일한 'paintEvent()'를 직접 호출하고 있습니다. 'update (this-> rect())'를 호출하고 Qt가'paintEvent'를 호출하도록해야합니다. 또한, 다른 위젯 (뷰포트) 페인트 장치를 사용하여 QPainter를 빌드하고 있습니다. 그로 인해 문제가 발생할 수도 있습니다. – andref

+0

가 여기에 또 다른 수정을했습니다 ... 이번에는 타원을 그리지 않았습니다. 경고가 나타납니다. QPainter :: begin : Painter가 이미 활성화되었습니다. – jdl

0

예에서 이 아닌을 호출하십시오. p.begin (this); inside

void QTextEditEnter::paintEvent(QPaintEvent *_event) {...} 

경고 메시지를 없애려는 경우.