【问题标题】:QT QVulkanWindow overlay widgetsQT QVulkanWindow 覆盖小部件
【发布时间】:2019-03-12 12:11:20
【问题描述】:

我正在寻找一种在 QVulkanWindow 上绘制任何 QT 小部件叠加层的方法。我找不到解决方案。子/父层次结构和 QT 标志不会带来预期的行为。是否可以在 QVulkanWindow 顶部绘制 QT 小部件?

我尝试了以下方法

1) 尝试从一个父 QWidget 创建 QWidget 和 Vulkan 窗口

auto widget = new QWidget;
widget->resize(m_default_width, m_default_height);
widget->show();

m_label = new QLabel("text.", widget);
m_label->show();

m_vulkan_window = std::make_shared<WSQVulkanWindow>(this);

m_vulkan_window->setVulkanInstance(&m_qt_vk_instance);

m_vulkan_window->show();

auto wrapper = QWidget::createWindowContainer(m_vulkan_window.get(), widget);

wrapper->resize(m_default_width, m_default_height);

wrapper->show();

2) 添加了以下标志

m_label->setAttribute(Qt::WA_NoSystemBackground);
m_label->setAttribute(Qt::WA_TranslucentBackground);
m_label->setWindowFlags(Qt::FramelessWindowHint | Qt::WindowStaysOnTopHint | Qt::CoverWindow);

标签显示在 vulkan 窗口顶部,但不跟随 vulkan 窗口位置

3) 尝试将 VulkanWindow 和 QLabel 小部件的 QWidget::createWindowContainer 添加到具有 QGridLayout 或 QVBoxLayout 的父小部件。

没有效果

4) 使用父级 newwidget->windowHandle() 创建 QVulkanWindow,并在 newwidget 父级上创建 QLabel 小部件

5) 使用父 QVulkanWindow 创建新的 QWindow。之后从 QWindow 创建小部件并为提到的小部件创建子 QLabel。

winapi 在 vulkan 窗口顶部创建按钮。但是不可能创建半透明的小部件

m_hwndButton = CreateWindowExW(
            0L,
            L"BUTTON",  // Predefined class; Unicode assumed 
            L"VR",      // Button text 
            WS_TABSTOP | WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON,  // Styles 
            10,         // x position 
            10,         // y position 
            50,        // Button width
            50,        // Button height
            (HWND)m_vulkan_window->winId(),     // Parent window
            NULL,       // No menu.
            (HINSTANCE)GetWindowLong((HWND)m_vulkan_window->winId(), -6), //instance
            NULL);      // Pointer not needed.

ShowWindow(m_hwndButton, SW_SHOW);
UpdateWindow(m_hwndButton);

【问题讨论】:

  • 请提供有关您迄今为止尝试过的方法以及它如何不起作用的信息。请包含一个小代码示例。

标签: qt vulkan


【解决方案1】:

子/父层次结构和 QT 标志不会带来预期的行为。

一旦表面由 GPU/Vulkan 管理,您就不能真正期望能够使用其他东西在其中绘制本机控件。

Qt 小部件并不适合在 Vulkan 表面上进行渲染。小部件通常是本机控件,因此要在 Vulkan 表面上显示它们,您必须将小部件捕获到图像,将该图像传输到 GPU,然后渲染图像。

如果您想要在 Vulkan 渲染中获取 UI,那么您最好的选择是 Imgui 或 QML。 QML 可以使用QQuickRenderControl 渲染到 OpenGL 表面,并且可以使用VK_KHR_external_memory 与 Vulkan 图像共享 GL 表面。另一方面,Imgui 被设计为能够直接在各种 GPU API 中渲染,其中 Vulkan 就是其中之一。在这两种情况下,您都将负责捕获 Qt 事件并将它们传递给 Imgui 或 QML 层。

【讨论】:

    猜你喜欢
    • 2010-12-09
    • 1970-01-01
    • 2012-04-10
    • 2019-08-22
    • 2017-10-31
    • 1970-01-01
    • 1970-01-01
    • 2017-08-22
    • 1970-01-01
    相关资源
    最近更新 更多