【问题标题】:QT how to change application window z indexQT如何更改应用程序窗口z索引
【发布时间】:2019-06-14 16:14:43
【问题描述】:

我试图将原生 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 之外的其他东西,是否可以完成,因为我真正需要的唯一部分是播放器层,因为我将创建自定义播放控制界面?

【问题讨论】:

  • 我开始认为这是不可能的。如果我理解正确,window-&gt;winId() 应该是实际的应用程序窗口本身,所以我尝试带来第三个 UIView,它将保存应用程序“window->winId()”超级视图和m_playerLayer(我放在另一个 UIView 中)这样我就可以使用bringSubviewToFrontsendSubviewToBack 更改它们的显示顺序。但无论我尝试什么,播放器组件始终位于顶部,就像它与整个应用程序完全分离一样。

标签: ios objective-c qt uiview qml


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    QQuickWindowUIView。单个 QML 项目不是,因此您不能将另一个 UIView(或其层)“内部”放置在 QML 应用程序中,除非您将应用程序构造为顶级 QQuickWindow 和额外的子 QQuickWindow 然后夹在中间那些 Qt Quick 窗口之间的视频层 (QWindows)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-02
      • 2012-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多