2013-07-17 59 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

錯誤清楚地解釋了這個問題 - 你試圖用p.begin繪製mousePressEvent,而不是在paintEvent函數中繪製。雖然它可能似乎有效,但可能會在稍後導致問題;如果沒有其他的話,肯定會有表現如果要在按下鼠標時使對象繪畫,請使用窗口的更新功能讓對象知道它需要重新繪製自己。 – TheDarkKnight

+0

增加了修改但是同樣的錯誤 – jdl

回答

6

由於繪製到窗口小部件的繪圖設備只允許在繪畫事件中出現,所以您會收到消息。如果您在繪畫事件之外使用它,則不能保證它能夠正常工作。因此,不要在mousePressEvent內繪畫,而應設置一個狀態變量(例如isPressed)並調用update,傳遞該控件的矩形。這將觸發繪畫事件,您可以在其中檢查狀態變量並相應地繪製窗口小部件。

+0

增加了修改但是同樣的錯誤 – jdl

+2

你直接調用'paintEvent()',這與在paint事件之外運行代碼相同。你必須調用'update(this-> rect())'並讓Qt調用'paintEvent'。另外,您正在使用另一個小部件(視口)繪製設備來構建QPainter。這也可能導致問題。 – andref

+0

在這裏做了另一個修改......這次橢圓arenet繪製。我得到警告:QPainter :: begin:Painter已經激活。 – jdl

0

在你的例子中做不是調用p.begin(this);裏面

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

如果你想擺脫警告信息。