QT QVulkanWindow оверлейные виджеты - PullRequest
0 голосов
/ 07 октября 2018

Я ищу способ нарисовать любое наложение виджета QT на QVulkanWindow.Я не могу найти решение.Дочерняя / родительская иерархия и флаги QT не приносят ожидаемого поведения.Можно ли рисовать виджеты QT в верхней части QVulkanWindow?

Я пробовал следующую

1) попытку создать окно QWidget и Vulkan из одного родительского QWidget

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

Метка отображается в верхней части окна вулкана, но не соответствует положению окна вулкана

3) Попытка добавить QWidget :: createWindowContainerвиджета VulkanWindow и QLabel для одного родительского виджета с помощью QGridLayout или QVBoxLayout.

Не действует

4) Создайте QVulkanWindow с родительским newwidget-> windowHandle () с последующим созданием виджета QLabel на newwidget parent

5) Создать новое QWindow с родительским QVulkanWindow.После этого создайте виджет из 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 голосов
/ 08 октября 2018

Дочерняя / родительская иерархия и флаги QT не приносят ожидаемого поведения.

Как только поверхность управляется GPU / Vulkan, вы не можете ожидать, что сможетерисовать родные элементы управления с чем-то еще.

Виджеты Qt не очень подходят для рендеринга на поверхности Вулкана.Виджеты, как правило, являются встроенными элементами управления, поэтому для отображения их на поверхности Vulkan вам необходимо захватить виджеты в изображение, перенести это изображение в графический процессор и затем отобразить изображение.

Если вы хотите получить интерфейс внутри рендеринга Vulkan, ваши лучшие ставки - это Imgui или QML.QML можно отобразить на поверхность OpenGL с помощью QQuickRenderControl, а эту поверхность GL можно использовать совместно с изображением Vulkan с помощью VK_KHR_external_memory.С другой стороны, Imgui предназначен для прямой визуализации в различных API-интерфейсах GPU, одним из которых является Vulkan.В обоих случаях вы будете нести ответственность за захват событий Qt и передачу их в слой Imgui или QML.

...