对于 qml 客户端,来自 c++ 的 QtWayland 注册失败
QtWayland registration from c++ fails for qml clients
我的 Qtwayland 合成器测试有一个奇怪的问题。它似乎仅适用于qt c ++客户端。Qml 客户端以死锁结束,事件处理停止(对于客户端(。 我更改了这个 https://doc.qt.io/archives/qt-5.11/qtwaylandcompositor-qwindow-compositor-example.html 示例并添加了以下功能:
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 客户端没有响应。创建窗口、输出和快速项的顺序是否正确?我错过了什么吗?
谢谢 凯恩
c++ 客户端使用单线程渲染,而 qml 客户端使用渲染线程。当一个暴露事件被发送到渲染器时,qtwayland将阻止它,除非输出被命令释放互斥锁。当渲染器锁定帧缓冲区时,它正在等待服务器,而主线程正在等待渲染线程 => 死锁。
回调可以通过以下方式发送 output->frameStarted((;渲染前 output->sendFrameCallbacks((;渲染后
相关文章:
- 无法将结构注册为增强几何体3D点
- 如何使用AngelScript注册SFML Vector2运算符
- 在遍历处理程序的向量时注册和注销处理程序
- 有没有任务栏API可以立即应用注册表更改
- 使用QJsEngine在Qt中注册自定义类型
- 检查注册表项是否链接到(或副本)另一个注册表项
- 如何使用 TStyleManager::UnRegisterStyle() 取消注册样式
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- SFML 碰撞永远不会在我的系统中注册
- 尝试从C++访问 UWP 的电子邮件邮件类会导致"REGDB_E_CLASSNOTREG类未注册"错误
- 用于创建/注册虚拟存储设备的 IOKit 驱动程序
- 如何添加预防措施以绕过未注册Microsoft.ACE.OLEDB.12.0?
- 进程外 EXE 的免注册 COM
- 如何注册Qt C++对象以在QML中使用它
- 在Qt中注册自定义元类型的别名类型
- 禁用地址共享注册表不起作用
- 如何从注册表项中提取配置单元和注册表名称
- C++库和自注册类:客户端应用程序中的工厂映射为空
- 注册表正在设置 1 个字符
- 对于 qml 客户端,来自 c++ 的 QtWayland 注册失败