如何在QML中创建没有标题栏但带有关闭/最小化/最大化按钮的窗口?

Ale*_*nde 6 user-interface go qml qt-quick qtquick2

我想创建一个没有标题栏,但具有本机关闭,最小化和最大化按钮的应用程序。这是布局的意图:

在Mac上看起来如何

该应用程序是使用Go和QML构建的。我可以通过添加以下内容来删除标题栏:

flags: Qt.FramelessWindowHint | Qt.Window
Run Code Online (Sandbox Code Playgroud)

但这意味着我必须重新创建各种本机行为,例如窗口移动和调整大小。我还手动重新创建了关闭/最小化/全屏按钮,但这意味着我失去了各种本机OS行为,例如窗口中的窗口捕捉或Mac上的zoom选项。

有一个更好的方法吗?是否有可能至少创建本机的max-min-close按钮,而不是从头开始构建它?

谢谢大家

小智 5

您可以使用objective-c 来正确设置您的窗口。这可能有点问题,但我已经解决了这个问题(创建一个单独的 .mm 类):

#include "macwindow.h"
#include <Cocoa.h>

MacWindow::MacWindow(long winid)
{
   NSView *nativeView = reinterpret_cast<NSView *>(winid);
   NSWindow* nativeWindow = [nativeView window];

   [nativeWindow setStyleMask:[nativeWindow styleMask] | NSFullSizeContentViewWindowMask | NSWindowTitleHidden];
   [nativeWindow setTitlebarAppearsTransparent:YES];

   [nativeWindow setMovableByWindowBackground:YES];
}
Run Code Online (Sandbox Code Playgroud)

在您的 main.cpp 中,您需要像这样传递窗口 ID:

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QWindow>
#include "macwindow.h"

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    QWindowList windows = QGuiApplication::allWindows();
    QWindow* win = windows.first();

    MacWindow* mac = new MacWindow(win->winId());

    return app.exec();
}   
Run Code Online (Sandbox Code Playgroud)

在您的 .pro 文件中,您需要添加 Cocoa 引用:

macx:LIBS += -framework Foundation -framework Cocoa
macx:INCLUDEPATH += /System/Library/Frameworks/Foundation.framework/Versions/C/Headers \
/System/Library/Frameworks/AppKit.framework/Headers \
/System/Library/Frameworks/Cocoa.framework/Headers
Run Code Online (Sandbox Code Playgroud)

不知道为什么,但我必须添加一个带有焦点属性的 TextEdit 才能正确绘制窗口,否则它看起来只是黑色(我的 main.qml):

import QtQuick 2.5
import QtQuick.Window 2.2
import QtQuick.Controls 1.4

ApplicationWindow {
    visible: true
    color: "white"
    width: 600
    height: 400
    minimumWidth: width
    minimumHeight: height
    maximumWidth: width
    maximumHeight: height

    Rectangle {
        anchors.fill: parent
        color: "white"

        TextEdit {
            opacity: 0
            focus: true
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明