我曾试图将本机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
,即使使用ApplicationWindow
color: "transparent"
,应用程序仍将具有背景