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) {...}