【问题标题】:Qt drawPixmap isn't drawing what I expectQt drawPixmap 没有画出我所期望的
【发布时间】:2012-07-04 09:47:50
【问题描述】:

我正在尝试使用 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 是如何工作的,但是 pixmap 是 800x600。 “dirtyrect” 应该保存整个像素图(从 x:0,y:0 开始,大小为 800x600)。

【问题讨论】:

  • 什么是 QPaintArea,记住事件位置是相对于小部件的,所以如果你有一些边距,那么你的像素图位置是 0+margin-left,0+margin-top
  • QPaintArea 是窗口,我创建的类。
  • 只是一个提示,但为 Qt 保留 Q 前缀,你应该为你选择其他:)。您是否在其中设置了任何布局?
  • 好吧,QPaintArea 是一个小部件。我创建了另一个 QMainWindow 作为窗口并使用 setCentralWidget()。
  • 你从哪里得到这些神奇的数字?为什么要在 QPaintArea 的一些计算 x、y 上绘制像素图?你意识到对于画家 QPoint(0,0) 是小部件的左上角吗?

标签: c++ qt paint qpixmap


【解决方案1】:

drawPixmap(target, pixmap, source) 在像素图源部分的画家区域(本例中为 QPaintArea)的目标矩形上绘制。因此,您在 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);
}

【讨论】:

  • 我想在窗口中心的一个矩形上绘制像素图。 x 和 y 是坐标。我的程序窗口设置为全屏,所以程序窗口的大小等于桌面大小。我采用桌面大小,减小像素图大小并将其除以 2。 -35 表示 y 是因为我采用桌面大小,而不是我的程序窗口大小,所以我需要减小菜单栏和其他东西。我想在窗口中心的某处绘制像素图。
  • 我试过了,它有效,谢谢。但是程序有完全相同的问题。
  • 那你做错了。此代码将在可用小部件空间的中间绘制像素图。我不会猜测是什么,因为很明显你应该坐下来分开问题。也许从根本不使用 QMainWindow 开始......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 2015-05-30
  • 2021-12-11
  • 2018-05-11
相关资源
最近更新 更多