c++ - Qt:在 QGraphicsView/QGraphicsScene 上有一个 child 的 QWidget 不工作

标签 c++ qt qgraphicsview

我想创建一个 View ,背景是基本图像,顶部是可拖动的小部件。

我的设置是这样的:

MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
    ui->graphicsView->setScene(new QGraphicsScene(nullptr));
    ui->graphicsView->scene()->addWidget(new BackgroundWidget(nullptr));
}

这很好用。也是如此:

MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
    ui->graphicsView->setScene(new QGraphicsScene(nullptr));
    BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
    new ForegroundWidget(bgWidget);
    ui->graphicsView->scene()->addWidget(bgWidget);
}

但是,我想动态添加前景小部件,但它不起作用。我注意到以下内容根本没有添加前景小部件:

MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
    ui->graphicsView->setScene(new QGraphicsScene(nullptr));
    BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
    ui->graphicsView->scene()->addWidget(bgWidget);
    new ForegroundWidget(bgWidget);
}

这会添加前景小部件,但不允许背景半透明(项目需要):

MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
    ui->graphicsView->setScene(new QGraphicsScene(nullptr));
    BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
    ui->graphicsView->scene()->addWidget(bgWidget);
    ui->graphicsView->scene()->addWidget(new ForegroundWidget(nullptr));
}

关于为什么在添加背景小部件后添加子小部件不起作用的任何想法?如果是这样,有什么解决办法吗?

谢谢。

编辑:更正了代码块中的一些愚蠢的输入错误。

Image of the problem

图片是本期的缩小版;小部件都设置为半透明(alpha 为 255 中的 100),但一个小部件似乎在另一个上方。如果我以任何方式添加“前景”小部件,我就会得到这个。以下是我期望得到的:

Ok version

正如我所说,如果我在附加到场景之前添加它们,效果很好,但我需要能够在运行时添加到场景。

最佳答案

您的代码中存在多个内存泄漏问题。

根据 BackgroundWidgetForegroundWidget 的实现,您要么想要

MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
    ui->graphicsView->setScene(new QGraphicsScene(nullptr));
    BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
    ForegroundWidget * fgWidget = new ForegroundWidget(bgWidget);
    ui->graphicsView->scene()->addWidget(fgWidget);
}

MainWindow::MainWindow(QWidget * parent) : QMainWindow(parent) {
    ui->graphicsView->setScene(new QGraphicsScene(nullptr));
    BackgroundWidget * bgWidget = new BackgroundWidget(nullptr);
    ForegroundWidget * fgWidget = new ForegroundWidget(nullptr);
    ui->graphicsView->scene()->addWidget(bgWidget);
    ui->graphicsView->scene()->addWidget(fgWidget);
}

完整示例:

#include <QtGui>

class MainWindow : public QMainWindow
{
public:
    MainWindow(QWidget *parent = 0) : QMainWindow(parent) {
        QGraphicsView *graphicsView = new QGraphicsView;
        setCentralWidget(graphicsView);

        QGraphicsScene *scene = new QGraphicsScene;
        graphicsView->setScene(scene);

        QWidget *fgWidget = new QWidget;
        fgWidget->setStyleSheet("background: rgba(255, 0, 0, 100)");
        fgWidget->setMinimumSize(100, 100);
        fgWidget->setMaximumSize(100, 100);

        QWidget *bgWidget = new QWidget;
        bgWidget->setStyleSheet("background: rgba(0, 0, 255, 100);");
        bgWidget->setMinimumSize(100, 100);
        bgWidget->setMaximumSize(100, 100);
        bgWidget->move(50, 50);

        scene->addWidget(fgWidget);
        scene->addWidget(bgWidget);
    }
};

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    MainWindow mainWindow;
    mainWindow.show();

    return app.exec();
}

enter image description here

如果您希望 fgWidget 成为 bgWidget 的父级:

    QWidget *bgWidget = new QWidget(fgWidget);
    ....
    scene->addWidget(fgWidget);
    //scene->addWidget(bgWidget); // don't add it to the scene

enter image description here

关于c++ - Qt:在 QGraphicsView/QGraphicsScene 上有一个 child 的 QWidget 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28988573/

相关文章:

linux - 如何使用 QML 更改系统日期和时间(嵌入式 Linux)?

qt - Qt 的最佳敏捷工具链是什么?

c++ - QGraphicsItemGroup 事件

c++ - QGraphicsView 是否拥有其关联图形场景的所有权?

c++ - 修复此编译错误 : identifier "and" is a special operator name in C++ [-Werror=c++-compat]?

c++ - 固定大小常量数组的常量数组作为 C++ 中方法的参数

c# - 是否可以从 C++ 应用程序调用 C# 应用程序?

c++ - 代码有效,但一切都乱七八糟

用于 Symbian VS 的 Qt。用于 MeeGo 的 Qt

python - 如何使用QGraphicsView::RubberBandDrag?