我使用无框窗口创建了一个QML应用程序,并实现了自己拖动和调整大小等操作。但是这样,应用程序不支持Windows aero snap或Gnome窗口管理器功能等本机窗口管理器功能。所以我搜索并找到了this,其中有人找到了使用win32 API在无框窗口中支持它们的方法。但是有没有办法将它用于QML应用程序或其他方式来使用本机窗口管理器功能?
我使用以下代码从C ++初始化窗口:
QQmlApplicationEngine engine(QUrl("qrc:/qml/main.qml"));
QObject *topLevel = engine.rootObjects().value(0);
QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);
window->setFlags(window->flags() | Qt::FramelessWindowHint);
if ( !window ) {
qWarning("Error: Your root item has to be a Window.");
return -1;
}
window->show();
编辑:我还想使用本机窗口管理器投影,就像我链接到的示例一样,如果可能的话。
编辑: 我有第二个问题:按照@Kuba Obers的说明,我得到它的工作方式。但是现在我遇到了这个问题,当我调整大小或移动它时,Qt会留下一个带有框架大小的未拉伸区域。
答案 0 :(得分:1)
winapi窗口句柄由window->winId()
:
HWND handle = window->winId();
您可以将此句柄传递给本机函数。
要过滤WM_NCCALCSIZE
消息,您需要通过继承QAbstractNativeEventFilter
来实现本机事件处理程序,并通过调用qApp->installNativeEventFilter(myFilter)
在应用程序上安装它的实例。