• 8188阅读
  • 3回复

QPainter 控制人物移动 [复制链接]

上一主题 下一主题
离线wlinqiunan
 

只看楼主 倒序阅读 楼主  发表于: 2011-05-24

这是用来控制人物移动的程序 编译后按方向键出现以下错误
QPainter::begin: A paint device can only be painted by one painter at a time.
QPainter::setPen: Painter not active


程序代码/-----------------------------------------

#include "keyevent.h"

KeyEvent::KeyEvent(QWidget *parent)
:QWidget(parent)
{
setWindowTitle(tr("Key Event"));

setAutoFillBackground(true);

QPalette palette = this->palette();
palette.setColor(QPalette::Window,Qt::white);
setPalette(palette);

setMinimumSize(512,256);
setMaximumSize(512,256);

width=size().width();
height=size().height();

pix = new QPixmap(width,height);
pix->fill(Qt::red);

step=32;
image.load(":/images/1.png");

startX=0;
startY=0;

drawPix();
}

KeyEvent::~KeyEvent()
{
}

void KeyEvent::drawPix()
{
pix->fill(Qt::white);
QPainter *painter = new QPainter(pix);
QPen pen(Qt::DotLine);
painter->setPen(pen);
for(int i=step;i<width;)
{
painter->drawLine(QPoint(i,0),QPoint(i,height));
i=i+step;
}
for(int j=step;j<height;)
{
painter->drawLine(QPoint(0,j),QPoint(width,j));
j=j+step;
}
painter->drawImage(QPoint(startX,startY),image);
}

void KeyEvent::keyPressEvent(QKeyEvent *event)
{
if(event->modifiers() == Qt::ControlModifier)
{
if(event->key() == Qt::Key_Left)
{
startX=(startX-1<0)?startX:startX-1;

}
if(event->key() == Qt::Key_Right)
{
startX=(startX+1+image.width ()>width)?startX:startX+1;

}
if(event->key() == Qt::Key_Up)
{
startY=(startY-1<0)?startY:startY-1;

}
if(event->key() == Qt::Key_Down)
{
startY=(startY+1+image.height()>height)?startY:startY+1;

}
}
else
{
startX=startX-startX%step;
startY=startY-startY%step;

if(event->key() == Qt::Key_Left)
{
startX=(startX-step<0)?startX:startX-step;
}
if(event->key() == Qt::Key_Right)
{
startX=(startX+step+image.width()>width)?startX:startX+step;
}
if(event->key() == Qt::Key_Up)
{
startY=(startY-step<0)?startY:startY-step;
}
if(event->key() == Qt::Key_Down)
{
startY=(startY+step+image.height()>height)?startY:startY+step;
}
if(event->key() == Qt::Key_Home)
{
startX=0;
startY=0;
}
if(event->key() == Qt::Key_End)
{
startX=width-image.width();
startY=height-image.height();
}
}
drawPix();
update();
}

void KeyEvent::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.drawPixmap(QPoint(0,0),*pix);
}
离线zhangyueyi87
只看该作者 1楼 发表于: 2011-05-24
QPainter::begin: A paint device can only be painted by one painter at a time.
一个绘图设备只能一次调用一个painter
你程序里有2个painter
离线uidab

只看该作者 2楼 发表于: 2011-05-24
void KeyEvent::drawPix()
{
pix->fill(Qt::white);
QPainter *painter = new QPainter(pix);
。。。。。
}

我记得QPainter只能在这里起作用。
paintEvent(QPaintEvent *)

[ 此帖被uidab在2011-05-24 12:22重新编辑 ]
有时候为了工作直接获得答案,而我却失去了思考的乐趣!


飘啊飘,何时能安居!
离线zpf123
只看该作者 3楼 发表于: 2011-06-27
大家好,这是什么意思啊?我也遇到了同样的问题啊
快速回复
限100 字节
 
上一个 下一个