Qt QQuickWidget конфликтует с QGraphicsVideoItem - PullRequest
0 голосов
/ 02 марта 2020

Я использовал QGraphicsScene и QGraphicsVideoItem в качестве холста. И чтобы управлять ими, я решил использовать qml и QQuickWidget для простой разработки пользовательских объектов для другого модуля. Однако я быстро столкнулся с проблемой, когда QGraphicsVideoItem будет отображаться не в QGraphicsScene, а скорее внутри QQuickWidget (как при пустом виджете, так и при подключенном источнике qml). И проблема, кажется, воспроизводима также с помощью проекта fre sh, просто поместив пустой QQuickWidget (через qt designer) где-нибудь внутри основного интерфейса.

Вот воспроизводимый код:

#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;

};

Проблема немедленно исчезла, когда я также удалил виджет из файла пользовательского интерфейса. Так я что-то здесь упускаю?

1 Ответ

0 голосов
/ 04 марта 2020

Когда вы вызываете ui.widget->setLayout(layout);, вы нарушаете макет, который был установлен в Qt Designer.

Вместо того, чтобы программно создавать QGraphicsView и QVBoxLayout в вашем *. cpp файле, добавьте их все в Qt Designer.

(Если проблема не устранена, отредактируйте исходное сообщение и включите файл * .ui)

...