3

我正在尝试在 Qt Creator 中制作一个支持拖动对象的自定义小部件。在最简单的形式中,小部件有一个 QRect(或任何其他形状),我可以在其上单击然后将其拖动到小部件周围。一旦我释放鼠标按钮, QRect 应该停止被拖动。

在我的 QWidget 类中,我有这个方法

void ImageArea::mouseMoveEvent(QMouseEvent *event)
{
    QPoint mousePos = event->pos();

    qDebug() << mousePos.x();
    qDebug() << mousePos.y();
    qDebug() << "---------";
}

当指针在屏幕上移动时,它可以获得鼠标的坐标。我尝试更新 x 和 y 的成员变量,然后通过 paintEvent 方法绘制 QRect,但这不起作用。

有没有人有什么建议?

4

3 回答 3

2

要获取鼠标移动事件,您必须将QWidget::mouseTracking属性设置为 true:

ImageArea::ImageArea( QWidget* p ) : QWidget( parent ) {
    ...
    setMouseTracking( true );
}
于 2011-04-04T06:16:23.117 回答
0

实现paintEvent(QPaintEvent *) 以在其相应成员变量的当前值指示的位置绘制对象。

在你改变了一个或多个成员变量的值之后(在 mouseMoveEvent 或任何地方),调用 this->update()。这将告诉 Qt 它需要在不久的将来再次调用您的 paintEvent 方法。

这应该是你需要做的所有事情。

于 2011-04-04T04:21:00.057 回答
0

请务必使用moveTo方法移动矩形。直接设置 x,y 位置可能会影响矩形的大小。

根据您的问题,我看不出您没有做什么。您确定矩形在绘制时处于新位置吗?

也许您错过了 Jeremy Friesner 要求实施的更新步骤。

您似乎缺少鼠标按钮跟踪。简单的方法可能是从 QApplication::mouseButtons() 获取鼠标按钮状态。虽然它可能效率略低。

于 2011-04-04T05:25:39.367 回答