我正在尝试使用Qt在C++中制作Paint应用程序。每次我单击或单击并拖动鼠标时,该程序都会在像素图上绘制一些内容。之后,它会更新调用paintEvent()的窗口,它将把像素图绘制到窗口上。
void QPaintArea::mousePressEvent(QMouseEvent *event){
startpoint = event->pos();
drawPoint(startpoint);
is_pressed = true;
}
void QPaintArea::mouseReleaseEvent(QMouseEvent *event){
is_pressed = false;
}
void QPaintArea::mouseMoveEvent(QMouseEvent *event){
if(is_pressed == true){
endpoint = event->pos();
drawLine(startpoint, endpoint);
startpoint = endpoint;
}
else{
return;
}
}
void QPaintArea::paintEvent(QPaintEvent *event){
QDesktopWidget *desktop = QApplication::desktop();
int x = (desktop->width() - 800) / 2;
int y = (desktop->height() - 600) / 2;
QPainter painter(this);
QRect target(QPoint(x, y - 35), QSize(800, 600));
QRect dirtyrect(QPoint(0,0), QSize(800, 600));
painter.drawPixmap(target, *pixmap, dirtyrect);
}
问题是,程序没有按预期将像素图打印到窗口上。例如,我在x:17,y:82处按下鼠标试图绘制某些内容。该程序将打印我绘制的内容,但会在偏移位置(例如x + 20,y)进行打印。
也许我不太了解QRect或drawPixmap的工作原理,但是像素图是800x600。 “dirtyrect”应该保存整个像素图(以x:0,y:0和800x600大小开头)。
最佳答案
drawPixmap(target,pixmap,source)在pixmap源区域的画家区域(在本例中为QPaintArea)的目标rect上进行绘画。因此,您可以在QPaintArea的某些(x,y-35,800,600)矩形上绘制整个像素图(0,0,800,600)。如果要在整个QPaintArea上绘制整个像素图,请使用drawPixmap(QPoint(0,0),* pixmap)。
//编辑
但是,如果您期望,将在距QPaintArea左上角一些偏移的情况下绘制像素图,则您的计算是错误的,并且如果您不解释要实现的目标,我们将无法为您提供帮助。向我们解释您对x,y的计算(对于y来说是-35的魔力),也许我们将能够弄清楚
//编辑
如果要在小部件上绘画,则不必使用-35之类的窗口偏移。小部件的0,0不是窗口框架的左上角,而是小部件内容的左上角。您如何看待它在其他平台上的表现?
如果要在窗口中间绘制,只需使用:
void QPaintArea::paintEvent(QPaintEvent *event){
QPoint middle = geometry.center();
int x = middle.x() - 800/2; // probably best would be pixmap->width()/2
int y = middle.y() - 600/2; // probably best would be pixmap->height()/2
QPainter painter(this);
painter.drawPixmap(QPoint(x,y), *pixmap);
}
关于c++ - Qt drawPixmap没有画出我所期望的,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11326563/