Qt drawPixmap没有画出我的期望

时间:2012-07-04 09:47:51

标签: c++ qt paint qpixmap

我正在尝试使用Qt在C ++中创建一个Paint应用程序。每次我点击或点击&拖动鼠标,程序将在pixmap上绘制一些东西。之后,它会更新调用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)。

1 个答案:

答案 0 :(得分:3)

drawPixmap(target,pixmap,source)绘制在painter区域的目标rect(本例中为QPaintArea)pixmap的源部分。因此,您在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);
}