我试图将原生 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:nWindowChanged(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 之外的其他东西,是否可以完成,因为我真正需要的唯一部分是播放器层,因为我'会创建自定义播放控制界面吗?
Best Answer-推荐答案 strong>
QQuickWindow 是一个 UIView 。单个 QML 项目不是,因此您不能将另一个 UIView (或其层)放置在 QML 应用程序“内部”,除非您将应用程序构造为顶级 QQuickWindow 带有额外的子 QQuickWindow ,然后将视频层夹在那些 Qt Quick 窗口(QWindows )之间。
关于ios - QT如何更改应用程序窗口z索引,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/54287152/
|