【问题标题】:QT Display a QWidget above QGraphicsSceneQT 在 QGraphicsScene 上方显示一个 QWidget
【发布时间】: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 上方?

【问题讨论】:

    标签: c++ qt c++11 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 有很多方法可以做到这一点。您可以使用布局并在其中添加小部件和视图。我已经更新了答案以显示一种可能的方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    相关资源
    最近更新 更多