首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对于qml客户端,从c++注册QtWayland失败

对于qml客户端,从c++注册QtWayland失败
EN

Stack Overflow用户
提问于 2019-12-19 22:35:18
回答 1查看 94关注 0票数 0

我的qtwayland合成器测试有一个奇怪的问题。它似乎只适用于qt c++客户端。Qml客户端以死锁结束,事件处理停止(对于客户端)。我已经更改了这个https://doc.qt.io/archives/qt-5.11/qtwaylandcompositor-qwindow-compositor-example.html示例,并添加了以下功能:

代码语言:javascript
复制
void Compositor::onSurfaceCreated(QWaylandSurface *surface)
{
    connect(surface, &QWaylandSurface::subsurfacePositionChanged, this, &WaylandInterface::onSubsurfacePositionChanged);
    QQuickWindow *window = new QQuickWindow();
    window->resize( 400, 400);
    window->setVisible(true);
    QWaylandOutput* output = new QWaylandOutput( this, window );

    QCoreApplication::processEvents();
    View *view = new View(this);
    view->setSurface(surface);
    view->setOutput(output);
    view->m_window = window;
    m_views << view;

    connect(surface, &QWaylandSurface::surfaceDestroyed, view, [view] {
        view->m_window->requestUpdate();
    } );

    connect(surface, &QWaylandSurface::hasContentChanged, this, &WaylandInterface::surfaceHasContentChanged);
    connect(surface, &QWaylandSurface::hasContentChanged, view, [view] {
        view->m_window->requestUpdate();
    } );
    connect(surface, &QWaylandSurface::redraw, view, [view] {
        view->m_window->requestUpdate();
    } );


    QWaylandQuickItem * surfacItem = new QWaylandQuickItem( view->m_window->contentItem() );
    surfacItem->setSurface( surface );
    surfacItem->setOutput( view->output() );
    surfacItem->setPaintEnabled(true);
    surfacItem->setInputEventsEnabled(true);
    connect(surface, &QWaylandSurface::offsetForNextFrame, view, &View::onOffsetForNextFrame);
    connect(view, &QWaylandView::surfaceDestroyed, this, &WaylandInterface::viewSurfaceDestroyed);
}

对于c++客户端,它创建一个窗口并将客户端嵌入其中,而qml客户端没有响应。创建窗口、输出和QuickItem的顺序是否正确?我错过了什么吗?

谢谢,凯恩

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-20 15:34:03

c++客户端使用单线程渲染,而qml客户端使用渲染线程。当一个expose事件被发送到渲染器时,qtwayland将阻止它,除非命令输出释放互斥锁。渲染器锁定帧缓冲区时,它正在等待服务器,而主线程正在等待渲染线程=>死锁。

回调可以通过output->frameStarted();//渲染前output->sendFrameCallback();//渲染后发送

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59411842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档