我正在寻找一种在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);
答案 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层。