让QGraphicsItem跟随某点移动C++
时间: 2023-08-26 09:03:50 浏览: 427
要让QGraphicsItem跟随某点移动,可以使用QGraphicsItem的setPos()函数来设置其位置。具体实现可以参考下面的代码:
```cpp
QPointF pointToFollow = ...; // 要跟随的点
QGraphicsItem* itemToMove = ...; // 要移动的QGraphicsItem
// 在每次需要更新位置时调用该函数
void updatePosition()
{
QPointF newPos = pointToFollow - QPointF(itemToMove->boundingRect().width() / 2, itemToMove->boundingRect().height() / 2);
itemToMove->setPos(newPos);
}
```
在updatePosition()函数中,通过计算要跟随的点的位置和QGraphicsItem的大小,得到新的位置,然后通过setPos()函数把QGraphicsItem移动到新位置。需要注意的是,boundingRect()函数返回的矩形是QGraphicsItem相对于其父图元的矩形,因此需要把其宽高除以2才能得到其中心点的位置。
相关问题
Qt c++用QGraphicsItem类实现按下左键生成一个矩形跟着鼠标沿x轴移动 松开后小时
可以通过继承QGraphicsItem类来实现按下左键生成一个矩形跟着鼠标沿x轴移动的功能。具体实现步骤如下:
1. 定义一个MyRect类,继承QGraphicsItem类。
2. 在MyRect类中重写boundingRect()和paint()函数,分别用于绘制矩形和获取矩形的边界矩形。
3. 在MyRect类中重写mousePressEvent()和mouseReleaseEvent()函数,分别处理鼠标按下和松开事件,实现生成矩形并跟随鼠标移动的功能。
下面是完整的代码实现:
```cpp
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsItem>
#include <QMouseEvent>
#include <QPainter>
class MyRect : public QGraphicsItem
{
public:
MyRect(QGraphicsItem* parent = nullptr)
: QGraphicsItem(parent)
, m_rect(0, 0, 0, 0)
{
setAcceptHoverEvents(true);
}
QRectF boundingRect() const override
{
return m_rect;
}
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override
{
painter->drawRect(m_rect);
}
protected:
void mousePressEvent(QGraphicsSceneMouseEvent* event) override
{
if (event->button() == Qt::LeftButton)
{
m_rect.setTopLeft(event->pos());
m_rect.setBottomRight(event->pos());
update();
}
}
void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override
{
if (event->buttons() & Qt::LeftButton)
{
m_rect.setBottomRight(event->pos());
update();
}
}
void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override
{
if (event->button() == Qt::LeftButton)
{
m_rect.setBottomRight(event->pos());
update();
}
}
private:
QRectF m_rect;
};
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene;
scene.setSceneRect(0, 0, 800, 600);
MyRect* rect = new MyRect;
scene.addItem(rect);
QGraphicsView view(&scene);
view.setRenderHint(QPainter::Antialiasing);
view.show();
return a.exec();
}
```
在这段代码中,我们定义了一个MyRect类,继承了QGraphicsItem类,并重写了boundingRect()、paint()、mousePressEvent()、mouseMoveEvent()和mouseReleaseEvent()函数。其中,boundingRect()用于获取矩形的边界矩形,paint()用于绘制矩形,mousePressEvent()、mouseMoveEvent()和mouseReleaseEvent()用于处理鼠标事件。
在mousePressEvent()函数中,我们检测到鼠标左键按下事件后,记录下矩形的左上角坐标,并将矩形的右下角坐标也设置为当前位置,然后调用update()函数通知系统重新绘制场景。
在mouseMoveEvent()函数中,我们检测到鼠标左键移动事件后,更新矩形的右下角坐标,并调用update()函数通知系统重新绘制场景。
在mouseReleaseEvent()函数中,我们检测到鼠标左键松开事件后,更新矩形的右下角坐标,并调用update()函数通知系统重新绘制场景。
最后,在main函数中,我们创建了一个QGraphicsScene对象和一个MyRect对象,并将MyRect对象添加到场景中。然后创建了一个QGraphicsView对象,并将其显示出来。这样,我们就可以在图形界面上按下左键生成一个矩形,并跟着鼠标沿x轴移动,松开鼠标后矩形消失了。
在qt中使用c++,用折线图元进行连线,将两个图元进行连接,并且鼠标拖动图元,折线可以跟着移动变化的效果,把头文件也带上
这个问题需要用到Qt中的图形框架和事件处理机制,需要用到以下头文件:
```cpp
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsLineItem>
#include <QGraphicsEllipseItem>
#include <QMouseEvent>
```
具体实现步骤如下:
1. 创建一个`QGraphicsScene`和一个`QGraphicsView`,并将`QGraphicsScene`设置为`QGraphicsView`的场景。
```cpp
QGraphicsScene* scene = new QGraphicsScene(this);
QGraphicsView* view = new QGraphicsView(scene, this);
```
2. 创建两个`QGraphicsEllipseItem`分别表示两个图元,并将它们添加到场景中。
```cpp
QGraphicsEllipseItem* item1 = new QGraphicsEllipseItem(0, 0, 50, 50);
QGraphicsEllipseItem* item2 = new QGraphicsEllipseItem(100, 100, 50, 50);
scene->addItem(item1);
scene->addItem(item2);
```
3. 创建一个`QGraphicsLineItem`表示折线,并将它添加到场景中。
```cpp
QGraphicsLineItem* line = new QGraphicsLineItem();
scene->addItem(line);
```
4. 在`QGraphicsView`中重载`mousePressEvent`、`mouseMoveEvent`和`mouseReleaseEvent`事件处理函数,实现鼠标拖动图元和折线跟随移动的效果。
```cpp
void MyGraphicsView::mousePressEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton) {
QGraphicsItem* item = itemAt(event->pos());
if (item == item1 || item == item2) {
m_movingItem = item;
m_lastPos = event->pos();
}
}
}
void MyGraphicsView::mouseMoveEvent(QMouseEvent* event)
{
if (m_movingItem) {
QPointF delta = event->pos() - m_lastPos;
m_movingItem->moveBy(delta.x(), delta.y());
updateLine();
m_lastPos = event->pos();
}
}
void MyGraphicsView::mouseReleaseEvent(QMouseEvent* event)
{
if (event->button() == Qt::LeftButton) {
m_movingItem = nullptr;
}
}
```
其中,`m_movingItem`表示当前被拖动的图元,`m_lastPos`表示上一次鼠标位置,`updateLine`函数用于更新折线的位置:
```cpp
void MyGraphicsView::updateLine()
{
QPointF p1 = item1->scenePos() + QPointF(item1->rect().width() / 2, item1->rect().height() / 2);
QPointF p2 = item2->scenePos() + QPointF(item2->rect().width() / 2, item2->rect().height() / 2);
line->setLine(QLineF(p1, p2));
}
```
阅读全文