【发布时间】: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) 是小部件的左上角吗?