Qt QQuickWidget 与 QGraphicsVideoItem 冲突

Posted

技术标签:

【中文标题】Qt QQuickWidget 与 QGraphicsVideoItem 冲突【英文标题】:Qt QQuickWidget conflicting with QGraphicsVideoItem 【发布时间】:2020-03-02 16:21:34 【问题描述】:

我一直使用 QGraphicsScene 和 QGraphicsVideoItem 作为我的画布。为了控制它们,我选择使用 qml 和 QQuickWidget 为不同的模块轻松开发自定义对象。但是,我很快遇到了一个问题,即 QGraphicsVideoItem 不会在 QGraphicsScene 中呈现,而是在 QQuickWidget 中呈现(当小部件为空或附加了 qml 源时)。而且这个问题似乎可以使用一个新项目重现,只需在主 ui 内的任何位置放置一个空的 QQuickWidget(通过 qt 设计器)。

这是可重现的代码:

#include "QtGuiApplication1.h"

QtGuiApplication1::QtGuiApplication1(QWidget *parent): QMainWindow(parent)

    ui.setupUi(this);

    QGraphicsView* view = new QGraphicsView(ui.widget);
    QGraphicsScene* scene = new QGraphicsScene();
    QGraphicsVideoItem* video = new QGraphicsVideoItem();
    QMediaPlayer* player = new QMediaPlayer();
    QUrl path = QUrl::fromLocalFile("D:/My Documents/Videos/XIII.mp4");
    QVBoxLayout* layout = new QVBoxLayout();

    layout->addWidget(view);
    ui.widget->setLayout(layout);
    video->setFlags(QGraphicsVideoItem::ItemIsMovable | QGraphicsVideoItem::ItemIsFocusable | QGraphicsVideoItem::ItemIsSelectable);
    video->setPos(100, 100);

    //view->setSceneRect(QRectF(QPointF(100, 100), QPointF(800, 600)));
    view->setScene(scene);

    player->setMedia(path);
    player->setVideoOutput(video);
    scene->addItem(video);

    player->play();

    view->show();


#pragma once

#include "ui_QtGuiApplication1.h"
#include <QtCore>
#include <QDebug>
#include <QGraphicsVideoItem>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QMediaPlayer>
#include <QUrl>
#include <QString>

class QtGuiApplication1 : public QMainWindow

    Q_OBJECT

public:
    QtGuiApplication1(QWidget *parent = Q_NULLPTR);

private:
    Ui::QtGuiApplication1Class ui;

;

当我从 ui 文件中删除小部件时,问题立即消失了。那么我在这里错过了什么吗?

【问题讨论】:

【参考方案1】:

当您调用 ui.widget-&gt;setLayout(layout); 时,您会破坏在 Qt Designer 中设置的布局。

不要以编程方式在您的 *.cpp 文件中创建 QGraphicsViewQVBoxLayout,而是将它们全部添加到 Qt Designer 中。

(如果问题仍然存在,请编辑您的原始帖子并包含您的 *.ui 文件)

【讨论】:

以上是关于Qt QQuickWidget 与 QGraphicsVideoItem 冲突的主要内容,如果未能解决你的问题,请参考以下文章

QQuickWidget+QML设置背景透明

Qt Qml,在 iOS 上将地图(OSM Mapbox Mapboxgl)嵌入到 QQuickWidget C++ 对象中

在 QQuickWidget 中更新/重绘仪表

无法在不中断堆叠顺序的情况下使 QQuickWidget 背景透明

使用 QQuickView 或 QQuickWidget 在 QWidget 应用程序中添加大量 QML 对象会带来性能问题

如何为 Windows XP 部署 Qt/QML 应用程序