C++Qt不用UI界面的方式实现类似multisim中复制拖拽器件并且器件之间连接起来的功能的完整代码
时间: 2024-02-03 08:11:19 浏览: 65
实现类似Multisim中复制拖拽器件并且器件之间连接起来的功能需要使用图形界面,因此本文提供使用C++和Qt框架实现此功能的完整代码。以下是一个简单的示例,其中通过QGraphicsScene和QGraphicsItem实现了拖拽和连接功能。
```c++
#include <QtWidgets>
class Node : public QGraphicsItem {
public:
Node(QGraphicsItem *parent = nullptr) : QGraphicsItem(parent) {}
QRectF boundingRect() const override { return QRectF(0, 0, 20, 20); }
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override {
painter->setBrush(Qt::white);
painter->drawEllipse(boundingRect());
}
};
class Edge : public QGraphicsItem {
public:
Edge(QGraphicsItem *parent = nullptr) : QGraphicsItem(parent) {}
QRectF boundingRect() const override { return QRectF(0, 0, 0, 0); }
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) override {
painter->setPen(QPen(Qt::black, 2));
painter->drawLine(line());
}
void setStart(QPointF point) { m_start = point; }
void setEnd(QPointF point) { m_end = point; }
QLineF line() const { return QLineF(m_start, m_end); }
private:
QPointF m_start;
QPointF m_end;
};
class GraphWidget : public QGraphicsView {
public:
GraphWidget(QWidget *parent = nullptr) : QGraphicsView(parent) {
m_scene = new QGraphicsScene(this);
setScene(m_scene);
setMinimumSize(640, 480);
setWindowTitle("Graph Widget");
setRenderHint(QPainter::Antialiasing);
setDragMode(QGraphicsView::ScrollHandDrag);
}
protected:
void mousePressEvent(QMouseEvent *event) override {
if (event->button() == Qt::LeftButton) {
m_node = new Node();
m_edge = new Edge();
m_scene->addItem(m_node);
m_scene->addItem(m_edge);
m_edge->setStart(mapToScene(event->pos()));
m_edge->setEnd(mapToScene(event->pos()));
m_node->setPos(mapToScene(event->pos()));
}
}
void mouseMoveEvent(QMouseEvent *event) override {
if (m_node) {
m_edge->setEnd(mapToScene(event->pos()));
}
}
void mouseReleaseEvent(QMouseEvent *event) override {
if (m_node) {
QList<QGraphicsItem *> items = m_scene->items(mapToScene(event->pos()));
foreach(QGraphicsItem *item, items) {
if (item != m_node) {
m_edge->setEnd(item->pos());
break;
}
}
m_node = nullptr;
m_edge = nullptr;
}
}
private:
QGraphicsScene *m_scene;
Node *m_node = nullptr;
Edge *m_edge = nullptr;
};
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
GraphWidget widget;
widget.show();
return app.exec();
}
```
在上面的代码中,我们定义了三个自定义的QGraphicsItem:Node、Edge和GraphWidget。Node表示器件,Edge表示连接线,GraphWidget是应用程序的主窗口。
在GraphWidget中,我们使用QGraphicsScene来管理Node和Edge的添加和删除,并重写了鼠标事件处理函数以实现拖拽和连接功能。
当用户按下鼠标左键时,我们会创建一个新的Node和Edge,并将它们添加到场景中。我们还将Edge的起始位置设置为鼠标单击位置,Node的位置设置为鼠标单击位置。
在用户移动鼠标时,我们将Edge的结束位置设置为当前鼠标位置。这样可以显示出连接线的效果。
当用户释放鼠标左键时,我们将Edge的结束位置设置为最近的Node的位置。这样可以将连接线连接到Node上。
最后,我们在主函数中创建GraphWidget并显示它。
阅读全文