[英]Qml Popup not coming on top of child window
I have a Qml App that has a Win32 window as a child window.我有一个 Qml 应用程序,它有一个 Win32 窗口作为子窗口。 Now, I simply want to show a popup on the click of a button(or Image in my case) on top of Win32 window but Popup is not coming on top.
现在,我只想在 Win32 窗口顶部单击按钮(或在我的情况下为图像)显示一个弹出窗口,但弹出窗口没有出现在顶部。
Working code is as below:-工作代码如下:-
main.cpp主程序
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QWindow>
#include "qt_windows.h"
#include "Windows.h"
#pragma comment(lib, "user32.lib")
/*
* Input Window proc
*/
LRESULT CALLBACK uiInputWindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
/*
* Create window that receives and forwards input
*/
void uiCreateInputWindow(
HWND parentWindow,
int x,
int y,
int width,
int height)
{
#define UI_INPUT_WINDOW_CLASS L"uiNativeInputWindowClass"
/*
* Register Window Class
*/
WNDCLASSEX wcex;
wcex.cbSize = sizeof wcex;
wcex.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
wcex.lpfnWndProc = (WNDPROC)uiInputWindowProc;
wcex.cbClsExtra = 0;
wcex.cbWndExtra = sizeof(void*);
wcex.hInstance = NULL;
wcex.hIcon = NULL;
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_BACKGROUND+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = UI_INPUT_WINDOW_CLASS;
wcex.hIconSm = NULL;
if (RegisterClassEx(&wcex) == 0 && GetLastError() != ERROR_CLASS_ALREADY_EXISTS)
{
return;
}
DWORD style = WS_CHILD;
DWORD exstyle = 0;
/*
* Create Window
*/
HWND hwnd = CreateWindowEx(
exstyle, // dwExStyle
UI_INPUT_WINDOW_CLASS, // lpClassName
L"uiNativeInputWindow", // lpWindowName
style, // dwStyle
x, // x
y, // y
width, // nWidth
height, // nHeight
parentWindow, // hWndParent
NULL, // hMenu
0, // hInstance
0); // lpParam
if (hwnd != NULL)
{
ShowWindow(hwnd, SW_SHOW);
SetFocus(hwnd);
}
}
/*
* Initialize ui
*/
int main(int argc, char* argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine* engine = new QQmlApplicationEngine;
engine->load(QUrl(QStringLiteral("qrc:/main.qml")));
QObject* qmlRoot = engine->rootObjects().first();
QWindow* mainWindow = qobject_cast<QWindow*>(qmlRoot);
int fbWidth = 1920, fbHeight = 1080;
uiCreateInputWindow((HWND)mainWindow->winId(), 0, 70, fbWidth, fbHeight);
app.exec();
}
main.qml主文件
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
import QtQuick.Window 2.12
ApplicationWindow {
id: root
x: 10
y: 10
width: 1920
height: 1150
visible: true
flags: Qt.Window | Qt.FramelessWindowHint
RowLayout {
anchors.fill: parent
spacing: 0
ColumnLayout {
spacing: 0
Rectangle {
id: topbar
color: "#232642"
Layout.fillWidth: true
Layout.preferredHeight: 70
MouseArea {
anchors.fill: parent
property point lastMouse
onPressed: {
lastMouse = mapToGlobal(mouseX, mouseY)
}
onPositionChanged: {
var newMouse = mapToGlobal(mouseX, mouseY)
root.x += newMouse.x - lastMouse.x
root.y += newMouse.y - lastMouse.y
lastMouse = newMouse
}
onDoubleClicked: {
root.visibility == ApplicationWindow.Windowed ?
root.showMaximized() :
root.showNormal()
}
}
RowLayout {
anchors.fill: parent
spacing: 0
Text {
text: "Test Window"
color: "#F8F8EE"
font.family: "Segoe UI"
font.pointSize: 11
font.weight: Font.DemiBold
Layout.fillHeight: true
Layout.topMargin: 10
Layout.leftMargin: 10
}
Item {
Layout.fillWidth: true
}
/*
Show Popup on click of this image
*/
Image {
id: cfgBtn
source: "Assets/cfgmenu.png"
Layout.fillHeight: true
Layout.preferredWidth: height
MouseArea {
anchors.fill: parent
onClicked: optionsPopup.open()
}
}
Image {
source: "Assets/closewindow.png"
Layout.fillHeight: true
Layout.preferredWidth: height
MouseArea {
anchors.fill: parent
onClicked: root.close()
}
}
}
}
Rectangle {
id: containerLv1
Layout.fillWidth: true
Layout.fillHeight: true
color: "black"
Rectangle {
id: containerLv2
width: Math.round(Math.min(containerLv1.width,
containerLv1.height * 16 / 9))
height: Math.round(Math.min(containerLv1.height,
containerLv1.width * 9 / 16))
anchors.centerIn: parent
visible: true
color: "grey"
}
}
}
}
/*
Desired popup to show
*/
Popup {
id: optionsPopup
x: cfgBtn.x - 160
y: topbar.y + topbar.height + 5
width: 200
height: 120
focus: true
dim: false
modal: true
padding: 0
closePolicy: Popup.CloseOnEscape | Popup.CloseOnPressOutside
contentItem: Rectangle {
id: rect
anchors.centerIn: parent
color: "#FF232642"
ColumnLayout {
spacing: 0
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
Rectangle {
Layout.preferredWidth: 200
Layout.preferredHeight: 40
color: "transparent"
Text {
anchors.fill: parent
text: "Option1"
color: "white"
font.pointSize: 14
}
}
Rectangle {
Layout.preferredWidth: 200
Layout.preferredHeight: 40
color: "transparent"
Text {
anchors.fill: parent
text: "Option2"
color: "white"
font.pointSize: 14
}
}
Rectangle {
Layout.preferredWidth: 200
Layout.preferredHeight: 40
color: "transparent"
Text {
anchors.fill: parent
text: "Option3"
color: "white"
font.pointSize: 14
}
}
}
}
}
}
The native window is part of our application and is used for receiving mouse and keyboard inputs.本机窗口是我们应用程序的一部分,用于接收鼠标和键盘输入。 Any suggestion is most welcomed.
任何建议都是最受欢迎的。
I did a hack to solve this.我做了一个黑客来解决这个问题。 Basically, the problem is everything that is drawn as part of Qml window gets hidden below the native window and there is no good way(that I can find online) to do this except by adding another layer of a modal window.
基本上,问题是作为 Qml 窗口一部分绘制的所有内容都隐藏在本机窗口下方,除了添加另一层模态窗口之外,没有什么好方法(我可以在网上找到)来做到这一点。
So, before opening the popup, just create a transparent modal window over which your popup can be shown and close this window when the popup closes.因此,在打开弹出窗口之前,只需创建一个透明的模式窗口,您的弹出窗口可以在该窗口上显示,并在弹出窗口关闭时关闭此窗口。
I am still looking for a better way to do this.我仍在寻找更好的方法来做到这一点。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.