在QGraphicsScene中嵌入QWidget,支持QWidget之间连线,代码C++
时间: 2024-03-18 19:39:49 浏览: 113
使用C++ QT模仿企业微信界面项目源码,用于学习QWidget的使用,含绘制,布局,信号,事件,重写,多线程,qss等技术
将QWidget嵌入到QGraphicsScene中需要使用QGraphicsProxyWidget类。而支持QWidget之间连线则需要自定义QGraphicsItem,实现其绘制和交互逻辑。
以下是一个简单的例子,演示如何在QGraphicsScene中嵌入两个QWidget并支持它们之间的连线:
```cpp
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsProxyWidget>
#include <QGraphicsLineItem>
#include <QWidget>
#include <QVBoxLayout>
#include <QDebug>
class MyWidget : public QWidget
{
public:
MyWidget(const QString& name, QWidget* parent = nullptr) : QWidget(parent)
{
QVBoxLayout* layout = new QVBoxLayout(this);
layout->addWidget(new QLabel(name, this));
layout->addWidget(new QPushButton("Button", this));
}
};
class MyItem : public QGraphicsItem
{
public:
MyItem(QWidget* widget, QGraphicsItem* parent = nullptr) : QGraphicsItem(parent), widget(widget)
{
// 设置可选中和可移动
setFlags(ItemIsSelectable | ItemIsMovable);
// 设置大小为widget的大小
setRect(0, 0, widget->width(), widget->height());
// 将widget嵌入到QGraphicsScene中
proxy = new QGraphicsProxyWidget(this);
proxy->setWidget(widget);
}
QRectF boundingRect() const override
{
return rect();
}
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override
{
Q_UNUSED(painter);
Q_UNUSED(option);
Q_UNUSED(widget);
// 不需要绘制任何东西
}
private:
QWidget* widget;
QGraphicsProxyWidget* proxy;
};
class MyScene : public QGraphicsScene
{
public:
MyScene(QObject* parent = nullptr) : QGraphicsScene(parent)
{
// 创建两个QWidget
MyWidget* widget1 = new MyWidget("Widget 1");
MyWidget* widget2 = new MyWidget("Widget 2");
// 在QGraphicsScene中添加两个MyItem
MyItem* item1 = new MyItem(widget1);
addItem(item1);
MyItem* item2 = new MyItem(widget2);
addItem(item2);
// 连接两个MyItem
QPointF p1 = item1->sceneBoundingRect().center();
QPointF p2 = item2->sceneBoundingRect().center();
QGraphicsLineItem* line = new QGraphicsLineItem(p1.x(), p1.y(), p2.x(), p2.y());
addItem(line);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MyScene scene;
QGraphicsView view(&scene);
view.show();
return a.exec();
}
```
在这个例子中,我们创建了一个MyWidget类,它继承自QWidget,并且包含一个QLabel和一个QPushButton。然后我们创建了一个MyItem类,它继承自QGraphicsItem,并且包含一个QGraphicsProxyWidget成员,用于将MyWidget嵌入到QGraphicsScene中。最后,我们在MyScene中创建了两个MyItem,并且连接了它们之间的连线。
阅读全文