QT开发中文网

proxy1->setWidget(item1);报错 main.cpp:258:22: error: cannot initialize a parameter of type 'QWidget *' with an lvalue of type 'MyGraphicsItem *' qgraphicsproxywidget.h:59:29: note: passing argument to parameter 'widget' here

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对象,并将其添加到场景中。我们通过设置代理小部件的位置、大小和布局来控制每个自定义图形项在网格布局中的位置。

现在你应该能够看到一个带有网格布局的视图,在其中显示了四个红色矩形。

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://qt.0voice.com/?id=2304

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?