QT как изменить окно приложения z index - PullRequest
0 голосов
/ 21 января 2019

Я пытался получить собственный iOS плеер в качестве пользовательского QML компонента и смог сделать это благодаря this .Однако я сталкиваюсь с проблемой порядка z компонента.

Конструктор компонента:

MyVideoView::MyVideoView(QQuickItem *parent /*= 0*/)
    : QQuickItem(parent)
    , m_view(0)
{
    connect(this, SIGNAL(windowChanged(QQuickWindow*)), this, SLOT(onWindowChanged(QQuickWindow*)));
    connect(this, SIGNAL(visibleChanged()), this, SLOT(onVisibleChanged()));
}

Реализация onWindowChanged:

void MyVideoView::onWindowChanged(QQuickWindow* window)
{
    if(!m_view) {
    }
    if (window != 0) {

        UIView *parentView = reinterpret_cast<UIView *>(window->winId());

                AVPlayer *_player;
                AVURLAsset *_asset;
                AVPlayerItem *_playerItem;
                AVPlayerLayer *m_playerLayer;

                _player = [[AVPlayer alloc] init];
                NSURL *baseURL = [[NSURL alloc] initWithString: @"http://devimages.apple.com/iphone/samples/bipbop/bipbopall.m3u8"];
                _asset = [AVURLAsset assetWithURL:baseURL];
                _playerItem = [AVPlayerItem playerItemWithAsset: _asset];
                [_player replaceCurrentItemWithPlayerItem:_playerItem];
                m_playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];

                m_playerLayer.frame = CGRectMake(this->x(), this->y(), this->width(), this->height());

                [parentView.layer addSublayer:m_playerLayer ];

                [_player play];


    } else {
        [m_view removeFromSuperView];
    }
}

С этим я могу использоватькомпонент в моем приложении, который является ApplicationWindow, но проблема в том, что компонент всегда находится сверху, покрывая все приложение, даже если я установил:

MyVideoView {
    z:-3
    width: 300
    height: 200
    x:20
    y:300
}

или поместил z другого компонента, например, 300.Я предполагаю, что это из-за QQuickWindow или вызвано UIView.Изменить: MyVideoView находится внутри Item компонента

Чего я хотел бы добиться, это:

  • либо сделать возможным установить компоненты z порядка
  • или получить компонент "позади" приложения (создание прозрачной части в моем приложении, чтобы видео было видно, не лучшее решение, но у меня заканчиваются варианты)

Есть лиспособ достижения одного из них, или это можно сделать, если компонент представляет собой что-то еще, кроме QQuickItem, поскольку единственная часть, которая мне действительно нужна, это уровень проигрывателя, так как я создам собственный интерфейс управления воспроизведением?

Ответы [ 2 ]

0 голосов
/ 28 января 2019

С подсказкой от Tor мне удалось заставить его работать.Сначала я создал еще один UIView для размещения m_playerLayer внутри него.

, а затем отстал от игрока:

[playerView.layer addSublayer:m_playerLayer];
[parentView.window addSubview: playerView];
[parentView.window sendSubviewToBack: playerView];
parentView.opaque = NO;

Важно отметить, что без parentView.opaque = NO приложение будетвсе еще есть фон даже с ApplicationWindow color: "transparent"

0 голосов
/ 24 января 2019

QQuickWindow является UIView.Отдельные элементы QML не являются, поэтому вы не можете поместить еще один UIView (или его слой) «внутри» приложения QML, если вы не структурируете приложение как верхний уровень QQuickWindow с дополнительным дочерним элементом QQuickWindow, а затем сэндвичвидео слой между этими окнами Qt Quick (QWindows).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...