Qt Qml弹出窗口未出现在子窗口顶部
我有一个Qml应用程序,它有一个Win32窗口作为子窗口。现在,我只想在Win32窗口顶部点击一个按钮(或我的例子中的图像)显示一个弹出窗口,但弹出窗口不会出现在顶部 工作代码如下:- main.cppQt Qml弹出窗口未出现在子窗口顶部,qt,qml,Qt,Qml,我有一个Qml应用程序,它有一个Win32窗口作为子窗口。现在,我只想在Win32窗口顶部点击一个按钮(或我的例子中的图像)显示一个弹出窗口,但弹出窗口不会出现在顶部 工作代码如下:- main.cpp #include <QGuiApplication> #include <QQmlApplicationEngine> #include <QQmlContext> #include <QWindow> #include "qt_win
#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();
}
本机窗口是我们应用程序的一部分,用于接收鼠标和键盘输入。任何建议都是非常受欢迎的。我做了一个黑客来解决这个问题。基本上,问题是作为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
}
}
}
}
}
}