QT QVulkanWindow覆盖小部件

时间:2018-10-07 18:56:29

标签: qt vulkan

我正在寻找一种在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)尝试通过QGridLayout或QVBoxLayout将VulkanWindow的QWidget :: createWindowContainer和QLabel小部件添加到一个父小部件中。

没有效果

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);

1 个答案:

答案 0 :(得分:0)

  

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

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

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

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