QT 在 QGraphicsScene 上方显示一个 QWidget

Posted

技术标签:

【中文标题】QT 在 QGraphicsScene 上方显示一个 QWidget【英文标题】:QT Display a QWidget above QGraphicsScene 【发布时间】:2014-11-29 11:33:16 【问题描述】:

目前我有一个 QGraphicsScene 放在 QGraphicsView 内并显示在显示屏上。我将所有元素添加到我设置为活动场景的scene

int main(int argc, char *argv[])

    QApplication a(argc, argv);
    QGraphicsView w;
    GameScene *gameScene = new GameScene(); // GameScene extends QGraphicsScene, adds tons of elements to the scene
    w.setScene(gameScene);
    w.show();
    return a.exec();

在这个场景之上,我想要一个包含多个布局元素的栏,比如几个QProgressBar

就我目前所发现的而言,QWidget 可以轻松定位。我已经制作了需要在场景上方显示的小部件:

QWidget *dummyWidget = new QWidget();
QFormLayout *formLayout = new QFormLayout;
QProgressBar *bar1 = new QProgressBar();
QProgressBar *bar2 = new QProgressBar();
bar1->setValue(20);
bar2->setValue(100);
formLayout->addRow("&Health:", bar1);
formLayout->addRow("&Energy:", bar2);
dummyWidget->setLayout(formLayout);
dummyWidget->show();

但是如何让这个显示在我的QGraphicsScene 上方?

【问题讨论】:

【参考方案1】:

如果您想在视图上方显示您的小部件,您可以使用类似于dummyWidget 的布局并在其中添加小部件和视图:

    QGraphicsView w;

    QWidget *widget = new QWidget();
    QFormLayout *formLayout2 = new QFormLayout(widget);

    QWidget *dummyWidget = new QWidget();
    QFormLayout *formLayout = new QFormLayout;
    QProgressBar *bar1 = new QProgressBar();
    QProgressBar *bar2 = new QProgressBar();
    bar1->setValue(20);
    bar2->setValue(100);
    formLayout->addRow("&Health:", bar1);
    formLayout->addRow("&Energy:", bar2);
    dummyWidget->setLayout(formLayout);

    formLayout2->addRow("", dynamic_cast<QWidget*>(dummyWidget));
    formLayout2->addRow("", dynamic_cast<QWidget*>(&w));

    widget->show();

如果你想在场景中添加小部件,你可以使用QGraphicsScene::addWidget为小部件创建一个新的QGraphicsProxyWidget,将它添加到场景中,并返回一个指向代理的指针:

QGraphicsProxyWidget * item = gameScene->addWidget(dummyWidget);
item->setPos(100,100);
item->setZValue(1);

您也可以将其添加到项目中:

item->setParentItem(anOtherItem);

【讨论】:

工作得很好,但是还有一种方法可以真正将其显示在整个场景之上,或者更确切地说,将场景显示在小部件下并将小部件扩展到屏幕的宽度?场景我在整个场景中放置了项目,使用这种方法我必须将它们全部偏移小部件的高度。 您想在场景中显示您的小部件,还是只是希望它位于视图上方和外部? 它不必显示在场景中,我希望它显示在我的场景上方。 @arbitter 有很多方法可以做到这一点。您可以使用布局并在其中添加小部件和视图。我已经更新了答案以显示一种可能的方式。

以上是关于QT 在 QGraphicsScene 上方显示一个 QWidget的主要内容,如果未能解决你的问题,请参考以下文章

Qt:选择的项目出现在 QGraphicsScene 的顶部

如何在 QGraphicsScene 中缩放图像? (Qt 5.11)

Qt5中show()后QGraphicsView/QGraphicsScene初始定位的基本问题

QGraphicsView与QGraphicsScene Qt窗体的消息传递

关于 海思Hi3516横竖屏Qt使用QGraphicsScene代理窗口强制旋转导致弹窗旋转与阴影不显示的 解决方案

关于 海思Hi3516横竖屏Qt使用QGraphicsScene代理窗口强制旋转导致弹窗旋转与阴影不显示的 解决方案