在qt中使用c++,写一个类,继承QGraphicsPathItem,QGraphicsLineItem,实现用鼠标点击选择连接,拖动,图元也跟着变动,折线方式
时间: 2024-02-16 16:03:14 浏览: 313
C++折线类的实现代码
以下是一个简单的示例,演示如何使用 C++ 在 Qt 中创建一个类,继承自 QGraphicsPathItem 和 QGraphicsLineItem,实现用鼠标拖动和选择连接的折线方式。
```c++
#include <QGraphicsPathItem>
#include <QGraphicsLineItem>
#include <QGraphicsSceneMouseEvent>
class MyLineItem : public QGraphicsPathItem, public QGraphicsLineItem
{
public:
MyLineItem(QGraphicsItem *parent = nullptr)
: QGraphicsPathItem(parent), QGraphicsLineItem(parent)
{
setFlag(QGraphicsItem::ItemIsSelectable, true);
setFlag(QGraphicsItem::ItemIsMovable, true);
setPen(QPen(Qt::black, 2));
}
void setLine(QPointF p1, QPointF p2)
{
QLineF line(p1, p2);
path().clear();
path().moveTo(line.p1());
path().lineTo(line.p2());
setLine(line);
}
void mousePressEvent(QGraphicsSceneMouseEvent *event) override
{
if (event->button() == Qt::LeftButton && event->modifiers() == Qt::NoModifier) {
// 选中连接的另一个图元
QGraphicsItem *item = scene()->itemAt(event->scenePos(), QTransform());
if (item && item->type() == MyLineItem::Type && item != this) {
MyLineItem *lineItem = qgraphicsitem_cast<MyLineItem*>(item);
if (lineItem) {
setSelected(false);
lineItem->setSelected(true);
return;
}
}
}
QGraphicsPathItem::mousePressEvent(event);
}
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override
{
QGraphicsPathItem::mouseMoveEvent(event);
setLine(line().translated(event->scenePos() - event->lastScenePos()));
}
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override
{
QGraphicsPathItem::mouseReleaseEvent(event);
setLine(line().translated(event->scenePos() - event->lastScenePos()));
}
};
```
这个类继承自 QGraphicsPathItem 和 QGraphicsLineItem,它具有选中和拖动的功能,并且可以通过鼠标点击连接到其他 MyLineItem 对象。
在 setLine() 方法中,我们使用传入的两个点创建 QLineF 对象,并将路径移动到起始点,然后向终点绘制一条直线。在 mousePressEvent() 方法中,我们检查鼠标是否按下左键并且没有按下任何修饰键,如果是,则查找鼠标下方的图元,并检查它是否是 MyLineItem 类型的对象。如果是,则将该对象设置为选中状态。在 mouseMoveEvent() 方法和 mouseReleaseEvent() 方法中,我们将线段平移相应的距离,以跟随鼠标移动。
请注意,这只是一个简单的示例,实际的实现可能会因您的需求而有所不同。
阅读全文