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



我曾试图将本机iOS播放器作为自定义QML组件,并因此成功实现。然而,我面临着组件的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之外的其他组件,是否可以实现,因为我真正需要的唯一部分是播放器层,因为我将创建一个自定义播放控制界面?

QQuickWindow是一个UIView。单独的QML项不是,因此您不能将另一个UIView(或其层)"放在"QML应用程序中,除非您将应用程序构造为具有附加子QQuickWindow的顶级QQuickWindow,然后将视频层夹在Qt Quick窗口(QWindows)之间。

在Tor的提示下,我设法让它工作起来。首先,我创建了另一个UIView,将m_playerLayer放在里面

然后让玩家落后:

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

需要指出的是,如果没有parentView.opaque = NO,即使使用ApplicationWindowcolor: "transparent",应用程序仍将具有背景

最新更新