gpt4 book ai didi

c++ - QGraphicsRectItem 用鼠标 move 。如何?

转载 作者:行者123 更新时间:2023-11-28 05:53:11 26 4
gpt4 key购买 nike

我有 QGraphicsViewQGraphicsSceneQGraphicsRectItemQGraphicsScene 中的 QGraphicsRectItemQGraphicsView 中的最后一个。我想用鼠标 move QGraphicsRectItem,只需要点击它!但在我的实现中,如果我单击 QGraphicsScene 上的任何位置,它就会 move 。无论是我的 QGraphicsRectItem 还是其他地方。还有第二个问题。该项目已 move 到场景的中心。再次点击它,它开始从原位置 move 。

void Steer::mousePressEvent(QMouseEvent *click)
{
offset = click->pos();
}

void Steer::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton)
{
p1->setPos(event->localPos() - offset); //p1 movable item
}
}

我做错了什么?

更新:

main.cpp

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

Steer w;
w.show();

return a.exec();
}

widget.h

#ifndef STEER_H
#define STEER_H

#include <QGraphicsView>
#include <QGraphicsScene>
#include <QMouseEvent>
#include <QPoint>
#include <QGraphicsRectItem>

class Steer : public QGraphicsView
{
Q_OBJECT

private:
QGraphicsScene *scene;
QGraphicsRectItem *p1;

QPoint offset;

public:
explicit Steer(QGraphicsView *parent = 0);
~Steer(){}

public slots:
void mousePressEvent(QMouseEvent * click);
void mouseMoveEvent(QMouseEvent * event);
};

#endif // STEER_H

widget.cpp

#include "widget.h"
#include <QBrush>

Steer::Steer(QGraphicsView *parent)
: QGraphicsView(parent)
{
scene = new QGraphicsScene;
p1 = new QGraphicsRectItem;

//add player
p1->setRect(760, 160, 10, 80);

//add scene
scene->setSceneRect(0, 0, 800, 400);

//add moveable item
scene->addItem(p1);

//set scene
this->setScene(scene);
this->show();
}

void Steer::mousePressEvent(QMouseEvent *click)
{
offset = click->pos();
}

void Steer::mouseMoveEvent(QMouseEvent *event)
{
if(event->buttons() & Qt::LeftButton)
{
p1->setPos(event->localPos() - offset);
}
}

最佳答案

我会尝试一种更容易理解的不同方法:

#include <QtWidgets>

class Steer : public QGraphicsView
{
public:
Steer()
{
scene = new QGraphicsScene;
p1 = new QGraphicsRectItem;

//add player
p1->setRect(0, 0, 10, 80);
p1->setX(760);
p1->setY(160);

//add scene
scene->setSceneRect(0, 0, 800, 400);

//add moveable item
scene->addItem(p1);

//set scene
this->setScene(scene);
this->show();
}

protected:
void mousePressEvent(QMouseEvent * click)
{
if (p1->contains(p1->mapFromScene(click->localPos()))) {
lastMousePos = click->pos();
} else {
lastMousePos = QPoint(-1, -1);
}
}

void mouseMoveEvent(QMouseEvent * event)
{
if(!(event->buttons() & Qt::LeftButton)) {
return;
}

if (lastMousePos == QPoint(-1, -1)) {
return;
}

p1->setPos(p1->pos() + (event->localPos() - lastMousePos));
lastMousePos = event->pos();
}

private:
QGraphicsScene *scene;
QGraphicsRectItem *p1;

QPoint lastMousePos;
};

int main(int argc, char *argv[])
{
QApplication a(argc, argv);

Steer w;
w.show();

return a.exec();
}

这里有几点需要指出:

  1. 不要使用setRect() 来设置QGraphicsRectItem 的位置。它doesn't work你认为可能的方式。始终使用 setPos() 更改项目的位置。

  2. 将偏移重命名为更具描述性的名称。我选择了 lastMousePos。不是只在按下鼠标时更新一次,而是在 move 鼠标时更新它。然后,只需获取两点之间的差异并将其添加到项目的位置即可。

  3. 在对 move 事件使用react之前检查鼠标是否实际位于项目上方。如果鼠标不在项目上,您需要通过某种方式知道这一点,因此需要 QPoint(-1, -1)。为此,您可能需要使用单独的 bool 标志。这解决了您看到的问题,即可以单击场景中的任意位置来 move 项目。

    此外,请注意 mapFromScene() 调用:contains() 函数在本地坐标中工作,因此我们必须在测试前映射场景坐标中的鼠标位置如果超过项目。

  4. 事件函数不是插槽,它们是 virtual, protected functions .


您还可以考虑在项目本身中处理这些事件。您不需要从 QGraphicsView 中执行此操作,尤其是当您有多个项目需要用鼠标拖动时。

关于c++ - QGraphicsRectItem 用鼠标 move 。如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34770656/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com