【问题标题】:Qt: QWidget with a child on QGraphicsView/QGraphicsScene not workingQt:在 QGraphicsView/QGraphicsScene 上有一个孩子的 QWidget 不工作
【发布时间】:2015-03-11 13:58:35
【问题描述】:

我希望创建一个在背景中具有基本图像的视图,并在顶部创建可拖动的小部件。

我的设置是这样的:

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));
}

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

谢谢。

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

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

正如我所说,如果我在附加到场景之前添加它们,它可以正常工作,但我需要能够在运行时添加到场景中。

【问题讨论】:

    标签: c++ qt qgraphicsview


    【解决方案1】:

    您的代码中有几个内存泄漏问题。

    取决于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();
    }
    

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

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

    【讨论】:

    • 更新:我在原始帖子中犯了几个复制粘贴错误。我已经尝试了您的建议 - 都添加了小部件,但完全禁用了我的项目所需的半透明的正确渲染。
    • 你仍然有内存泄漏。如果使用new,则必须使用delete,或者将其作为父类传递给QObject-派生类。你不能只做new ForegroundWidget(bgWidget); 之类的事情。另外,张贴截图。
    • 好了,代码sn-ps简化了。我们可以假设指针保存在类中并在析构函数中调用 deleteLater() 吗?
    • 添加了一些屏幕截图。
    • 添加了一个完整的例子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-01
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 2012-01-22
    相关资源
    最近更新 更多