Frage

The code works but I get the following warning message while I press the mouse while it is executing: ??

QPainter::begin: Widget painting can only begin as a result of a 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());
}
War es hilfreich?

Lösung

You get the message because painting to the widget's paint device is only allowed inside the paint event. If you use it outside the paint event, there's no guarantee it will work. So, instead of painting inside the mousePressEvent, set a state variable (e.g. isPressed) and call update, passing the widget's rect. This will trigger the paint event, where you can check the state variable and paint the widget accordingly.

Andere Tipps

In your example do not call p.begin(this); inside

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

if you want to get rid of the warning message.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top