Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ QPaint::begin:小部件绘制只能作为绘制事件的结果开始_C++_Qt_Qpainter - Fatal编程技术网

C++ QPaint::begin:小部件绘制只能作为绘制事件的结果开始

C++ QPaint::begin:小部件绘制只能作为绘制事件的结果开始,c++,qt,qpainter,C++,Qt,Qpainter,代码可以工作,但在执行鼠标时,我会收到以下警告消息: 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
进一步向下添加修改



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

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

在您的示例中,donot调用p.begin(This);里面


如果您想删除警告消息。

在您的示例中,请不要调用p.begin(此);里面


如果要删除警告消息。

错误清楚地解释了问题-您尝试使用p.begin在mousePressEvent中绘制,而不是在paintEvent函数中渲染。虽然它可能看起来有效,但以后可能会引起问题;当然是为了表现,如果没有别的。如果要使对象在按下鼠标时进行绘制,请使用窗口的更新功能让对象知道它需要重新绘制自身。添加了修改,但出现了相同的错误错误该错误清楚地解释了问题-您尝试使用p.begin在MousePresseEvent中绘制,而不是在paintEvent函数中渲染。虽然它可能看起来有效,但以后可能会引起问题;当然是为了表现,如果没有别的。如果要使对象在按下鼠标时进行绘制,请使用窗口的更新功能让对象知道它需要重新绘制自身。添加了修改,但与直接调用
paintEvent()
的错误相同,这与在绘制事件外运行代码相同。您必须调用
update(this->rect())
并让Qt调用
paintEvent
。此外,您正在使用另一个小部件的(视口)绘制设备构建QPaint。这也可能导致问题。在此进行了另一次修改。。。这一次,埃利斯·阿雷内特作画。我得到警告:QPainter::begin:Painter已经处于活动状态。Qt真的在尝试帮助您处理这些警告。阅读文档。我相信你能想出这个办法。也非常好。您直接调用
paintEvent()
,这与在paint事件之外运行代码相同。您必须调用
update(this->rect())
并让Qt调用
paintEvent
。此外,您正在使用另一个小部件的(视口)绘制设备构建QPaint。这也可能导致问题。在此进行了另一次修改。。。这一次,埃利斯·阿雷内特作画。我得到警告:QPainter::begin:Painter已经处于活动状态。Qt真的在尝试帮助您处理这些警告。阅读文档。我相信你能想出这个办法。也真的很好。
#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());
}
void QTextEditEnter::paintEvent(QPaintEvent *_event) {...}