【问题标题】:QPainter::begin: Widget painting can only begin as a result of a paintEventQPainter::begin:控件绘画只能作为paintEvent的结果开始
【发布时间】:2013-07-17 15:55:09
【问题描述】:

代码有效,但在执行时按下鼠标时收到以下警告消息:??

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());
}

【问题讨论】:

  • 该错误清楚地解释了问题 - 您尝试使用 p.begin 在 mousePressEvent 中绘制,而不是在 paintEvent 函数中呈现。虽然它可能看起来有效,但它可能会在以后引起问题;如果没有别的,当然是为了性能。如果你想让对象在鼠标按下时进行绘制,使用窗口的更新功能让对象知道它需要自己重新绘制。
  • 添加了修改但同样的错误

标签: c++ qt qpainter


【解决方案1】:

您会收到消息,因为仅允许在绘制事件内绘制到小部件的绘制设备。如果您在绘画事件之外使用它,则无法保证它会起作用。因此,不要在mousePressEvent 内绘制,而是设置一个状态变量(例如isPressed)并调用update,传递小部件的矩形。这将触发绘制事件,您可以在其中检查状态变量并相应地绘制小部件。

【讨论】:

  • 你是直接调用paintEvent(),和在paint事件之外运行代码是一样的。您必须调用update(this-&gt;rect()) 并让Qt 调用paintEvent。此外,您正在使用另一个小部件的(视口)绘制设备构建 QPainter。这也可能导致问题。
  • 在这里做了另一个修改...这次椭圆是arenet draw。我收到警告:QPainter::begin: Painter already active.
  • Qt 确实在尝试帮助您解决警告。阅读QPainter::begin 文档。我相信你能解决这个问题。
  • This one也不错。
【解决方案2】:

在你的例子中 not 调用 p.begin(this);里面

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

如果你想摆脱警告信息。

【讨论】:

    猜你喜欢
    • 2017-04-13
    • 1970-01-01
    • 2013-03-20
    • 1970-01-01
    • 2021-03-31
    • 1970-01-01
    • 2019-01-16
    • 2011-08-30
    • 2023-04-04
    相关资源
    最近更新 更多