我正在尝试使用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/

10-12 06:24