公有继承QObject和QGrapgicsPathItem后实现鼠标绘制直线图元完整代码
时间: 2023-11-27 07:50:52 浏览: 43
这里是一个完整的实现鼠标绘制直线图元的示例代码:
```cpp
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsLineItem>
#include <QMouseEvent>
class LineItem : public QObject, public QGraphicsLineItem
{
Q_OBJECT
public:
LineItem(QGraphicsItem *parent = nullptr)
: QObject(), QGraphicsLineItem(parent)
{
setFlag(QGraphicsItem::ItemIsSelectable);
}
void mousePressEvent(QGraphicsSceneMouseEvent *event) override
{
if (event->button() == Qt::LeftButton) {
m_startPos = event->scenePos();
m_endPos = event->scenePos();
setLine(QLineF(m_startPos, m_endPos));
setSelected(true);
} else {
QGraphicsLineItem::mousePressEvent(event);
}
}
void mouseMoveEvent(QGraphicsSceneMouseEvent *event) override
{
if (isSelected() && event->buttons() & Qt::LeftButton) {
m_endPos = event->scenePos();
setLine(QLineF(m_startPos, m_endPos));
} else {
QGraphicsLineItem::mouseMoveEvent(event);
}
}
void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) override
{
if (isSelected() && event->button() == Qt::LeftButton) {
emit lineFinished(QLineF(m_startPos, m_endPos));
} else {
QGraphicsLineItem::mouseReleaseEvent(event);
}
}
signals:
void lineFinished(QLineF line);
private:
QPointF m_startPos;
QPointF m_endPos;
};
class GraphicsScene : public QGraphicsScene
{
Q_OBJECT
public:
GraphicsScene(QObject *parent = nullptr)
: QGraphicsScene(parent)
{
connect(this, &GraphicsScene::lineFinished, this, &GraphicsScene::addLineItem);
}
void mousePressEvent(QGraphicsSceneMouseEvent *event) override
{
if (event->button() == Qt::LeftButton) {
m_lineItem = new LineItem();
addItem(m_lineItem);
m_lineItem->setPos(event->scenePos());
} else {
QGraphicsScene::mousePressEvent(event);
}
}
private slots:
void addLineItem(QLineF line)
{
QGraphicsLineItem *lineItem = new QGraphicsLineItem(line);
addItem(lineItem);
}
private:
LineItem *m_lineItem;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsView view;
GraphicsScene scene;
view.setScene(&scene);
view.show();
return a.exec();
}
#include "main.moc"
```
这个示例代码使用了 Qt 的图形框架,通过公有继承 QObject 和 QGraphicsPathItem 来实现自定义的直线图元,并在 `mousePressEvent`、`mouseMoveEvent` 和 `mouseReleaseEvent` 中监听鼠标事件,实现了鼠标绘制直线的功能。同时,使用了信号和槽机制,使得当鼠标绘制完成一条直线时,将直线添加到场景中。