QGraphicsProxyWidget::setWidget()
函数接受一个QWidget类型的参数,因此我们需要将自定义图形项转换为一个QWidget对象。
以下是修改后的代码:
#include <QtWidgets>
// 自定义图形项
class MyGraphicsItem : public QGraphicsRectItem {
public:
MyGraphicsItem(QGraphicsItem* parent = nullptr) : QGraphicsRectItem(parent) {}
void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) override {
// 绘制一个红色矩形
painter->setBrush(Qt::red);
painter->drawRect(boundingRect());
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QGraphicsScene scene;
// 创建4个自定义图形项,并将其添加到场景中
MyGraphicsItem* item1 = new MyGraphicsItem;
MyGraphicsItem* item2 = new MyGraphicsItem;
MyGraphicsItem* item3 = new MyGraphicsItem;
MyGraphicsItem* item4 = new MyGraphicsItem;
scene.addItem(item1);
scene.addItem(item2);
scene.addItem(item3);
scene.addItem(item4);
// 在视图中创建网格布局
QGridLayout layout;
// 使用QGraphicsProxyWidget将自定义图形项转换为QWidget对象,并将其添加到布局中
QGraphicsProxyWidget *proxy1 = new QGraphicsProxyWidget();
proxy1->setWidget(new QWidget());
proxy1->setPos(0, 0); // 设置代理小部件在场景中的位置和大小
proxy1->resize(item1->boundingRect().size().toSize());
scene.addItem(proxy1);
proxy1->setWidgetResizable(false); // 禁用代理小部件的大小调整
QGridLayout* itemLayout1 = new QGridLayout();
itemLayout1->addWidget(item1);
proxy1->setLayout(itemLayout1);
QGraphicsProxyWidget *proxy2 = new QGraphicsProxyWidget();
proxy2->setWidget(new QWidget());
proxy2->setPos(item1->boundingRect().width(), 0);
proxy2->resize(item2->boundingRect().size().toSize());
scene.addItem(proxy2);
proxy2->setWidgetResizable(false);
QGridLayout* itemLayout2 = new QGridLayout();
itemLayout2->addWidget(item2);
proxy2->setLayout(itemLayout2);
QGraphicsProxyWidget *proxy3 = new QGraphicsProxyWidget();
proxy3->setWidget(new QWidget());
proxy3->setPos(0, item1->boundingRect().height());
proxy3->resize(item3->boundingRect().size().toSize());
scene.addItem(proxy3);
proxy3->setWidgetResizable(false);
QGridLayout* itemLayout3 = new QGridLayout();
itemLayout3 ->addWidget(item3);
proxy3 ->setLayout(itemLayout3);
QGraphicsProxyWidget *proxy4 = new QGraphicsProxyWidget();
proxy4 -> setWidget(new QWidget());
proxy4 -> setPos(proxy3 ->pos() + QPointF(proxy3 ->boundingRect().width(), 0));
proxy4 -> resize(item4 -> boundingRect().size().toSize());
scene.addItem(proxy4);
proxy4 -> setWidgetResizable(false);
QGridLayout* itemLayout4 = new QGridLayout;
itemLayout4 -> addWidget(item4);
proxy4 -> setLayout (itemLayout4);
// 创建一个QGraphicsView,将其设置为该场景,并将其添加到布局中
QGraphicsView view(&scene);
view.setLayout(&layout);
// 显示视图
view.show();
return a.exec();
}
在这个修改后的代码中,我们使用QGraphicsProxyWidget
类将自定义图形项转换为QWidget对象,并将其添加到场景中。我们通过设置代理小部件的位置、大小和布局来控制每个自定义图形项在网格布局中的位置。
现在你应该能够看到一个带有网格布局的视图,在其中显示了四个红色矩形。