QT如何更改应用程序窗口的z索引

时间:2019-01-21 09:44:21

标签: ios objective-c qt uiview qml

我试图将本地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。 我认为这是由于QQuickWindowUIView引起的。 编辑:MyVideoView放在Item组件内

我想要实现的是:

  • 都可以设置组件的z顺序
  • 或让组件位于应用程序的“后面”(在我的应用程序上创建透明部分,以便观看视频,这不是最好的解决方案,但我的选择已经用完了)

有什么方法可以实现其中之一吗?或者,如果该组件是除QQuickItem之外的其他组件,那么可以做到这一点,因为我真正需要的只是播放器层,因为我将创建一个自定义播放控制界面?

2 个答案:

答案 0 :(得分:0)

QQuickWindowUIView。单独的QML项不是,因此您不能在QML应用程序的“内部”放置另一个UIView(或其层),除非您将该应用程序构造为具有其他子项{{1}的顶层QQuickWindow }},然后将视频层夹在这些Qt Quick窗口(QQuickWindow)之间。

答案 1 :(得分:0)

在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",应用程序仍然具有背景。