Почему QPainter может отказаться работать внутри paintEvent?

У меня есть:

class QTextEditEnter : public QTextEdit
{
    Q_OBJECT
public:
    QTextEditEnter( QWidget *_parent ) : QTextEdit(_parent)
    {
        this -> setFrameStyle( QFrame::Sunken ); // Sunken!
    }

protected:
    virtual void keyPressEvent(QKeyEvent * event);
    virtual void paintEvent(QPaintEvent *_event)
    {
        QTextEdit::paintEvent( _event );
        QPainter pnt(this);
        pnt.setPen( QColor( 0, 0, 0, 0xff ));
        pnt.drawRect( 0, 0, width(), height());
    }

    signals:
        void signalPressEnter();
};

что дает:

QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::setPen: Painter not active
QPainter::drawRects: Painter not active
QPainter::begin: Widget painting can only begin as a result of a paintEvent
QPainter::setPen: Painter not active
QPainter::drawRects: Painter not active

Почему это может быть?

Обновить

// QPainter( this )
// QTextEdit::paintEvent at the begining of custom PaintEvent
// RESULT: "QPainter::begin: Widget painting can only begin as a result of a paintEvent" ...
virtual void paintEvent(QPaintEvent *_event)
{
    QTextEdit::paintEvent( _event );
    QPainter pnt( this );
    pnt.setPen( QColor( 0, 0, 0, 0xff ));
    pnt.drawRect( 0, 0, width()-1, height()-1);
}

// QPainter ( viewport() )
// QTextEdit::paintEvent at the begining of custom PaintEvent
// RESULT: works.
virtual void paintEvent(QPaintEvent *_event)
{
    QTextEdit::paintEvent( _event );
    QPainter pnt( viewport() );
    pnt.setPen( QColor( 0, 0, 0, 0xff ));
    pnt.drawRect( 0, 0, width()-1, height()-1);
}

// *** BONUS ***
// QPainter( viewport() ) or QPainter ( this )
// QTextEdit::paintEvent after QPainter() constructor.
// RESULT: Segmentation fault.
virtual void paintEvent(QPaintEvent *_event)
{
    QPainter pnt( viewport() );
    pnt.setPen( QColor( 0, 0, 0, 0xff ));
    QTextEdit::paintEvent( _event ); // WRONG PLACE!!!
    pnt.drawRect( 0, 0, width()-1, height()-1);
}

person pavelkolodin    schedule 21.11.2012    source источник
comment
Похоже, вы где-то явно вызываете QTextEditEnter::paintEvent(). Может ли это быть так? Он должен вызываться непосредственно Qt только из цикла обработки событий.   -  person Tilman Vogel    schedule 22.11.2012
comment
Тилман Фогель, я думаю, что нет - не нашел прямого вызова.   -  person pavelkolodin    schedule 22.11.2012
comment
Вы можете проследить свою программу в режиме отладки и проверить, выводит ли она такие сообщения. Предоставьте нам больше информации, плз.   -  person tro    schedule 22.11.2012
comment
@troyane о ... я не дружу с отладкой такого кода, особенно в Linux, что имеет место в моем случае :)   -  person pavelkolodin    schedule 22.11.2012
comment
В нескольких словах. Вы должны изменить тип сборки (с выпуска) на отладку, затем добавить точку останова в свой код и запустить (F5). Используйте элементы управления отладкой (вход, переход), чтобы отслеживать код в реальном времени. Удачи!   -  person tro    schedule 22.11.2012
comment
@troyane, я исследую эту проблему в Linux, Visual Studio пока не мой вариант :)   -  person pavelkolodin    schedule 22.11.2012
comment
это оффтоп, но я говорю даже про линукс, про QtCreator как IDE   -  person tro    schedule 22.11.2012
comment
Возникает ли эта проблема из-за вашего кода рисования или из-за вызова QTextEdit::paintEvent(_event)?   -  person dowhilefor    schedule 23.11.2012


Ответы (1)


Вместо

QPainter pnt(this);

пытаться

QPainter pnt(viewport());
pnt.setPen(QColor( 0, 0, 0, 0xff ));
pnt.drawRect(viewport()->rect());

viewport () — это область для рисования, и это может быть причиной проблемы.

person Viv    schedule 23.11.2012
comment
Благодарю вас! Это помогло! Viewport() является методом QAbstractScrollArea (насколько я помню), но не существует в обычном QWidget. И в случае, если вы наследуете QTextEdit, вы должны помнить об использовании viewport(), но не этого. Это странно, потому что это надо запомнить... - person pavelkolodin; 24.11.2012