c++ - 为什么 QPainter 可能会拒绝在 paintEvent 内部工作?

标签 c++ qt user-interface 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);
}

最佳答案

代替

QPainter pnt(this);

尝试

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

viewport() 是可绘制区域,可能是导致问题的原因

关于c++ - 为什么 QPainter 可能会拒绝在 paintEvent 内部工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13502317/

相关文章:

qt - 如何在QApplication执行之前获取QScreen

c++ - 一端优先的随机算法

c++ - 如何捕获 websocket 连接错误

java从同一个UI启动多个swingworker

c++ - 这是一个很好的 std::auto_ptr<> 用例吗?

c++ - 迭代 Eigen 中的对称稀疏矩阵

c++ - 具有某种条件的宏

c++ - 如何确定 Box2d 中的相对碰撞角度

c# - 子窗口顶部的 WPF 所有者窗口

java - 尝试使用 jtextfield 捕获异常?