我的解决方案(基于Eduard的方案,调整了窗口可拖动)。
(完整源代码https://github.com/teimuraz/qt-macos-without-title)
创建macos.h和macos.mm文件(如果使用qt creator创建,请将macos.cpp重命名为macos.mm)。
macos.h
#ifndef MACOS_H
#define MACOS_H
#include <QGuiApplication>
#include <QWindow>
class MacOS {
MacOS(long winid);
public:
static void removeTitlebarFromWindow(long winId = -1);
};
#endif
macos.mm
#include "macos.h"
#include <Cocoa/Cocoa.h>
#include <QGuiApplication>
#include <QWindow>
void MacOS::removeTitlebarFromWindow(long winId)
{
if(winId == -1) {
QWindowList windows = QGuiApplication::allWindows();
QWindow* win = windows.first();
winId = win->winId();
}
NSView *nativeView = reinterpret_cast<NSView *>(winId);
NSWindow* nativeWindow = [nativeView window];
[nativeWindow setStyleMask:[nativeWindow styleMask] | NSFullSizeContentViewWindowMask | NSWindowTitleHidden];
[nativeWindow setTitlebarAppearsTransparent:YES];
[nativeWindow setMovableByWindowBackground:YES];
}
main.qml
import QtQuick
import QtQuick.Controls
ApplicationWindow {
id: mainWindow
visible: true
width: 640
height: 480
property int previousX
property int previousY
MouseArea {
anchors {
top: parent.top
bottom: parent.bottom
left: parent.left
right: parent.right
}
onPressed: {
previousX = mouseX
previousY = mouseY
}
onMouseXChanged: {
var dx = mouseX - previousX
mainWindow.setX(mainWindow.x + dx)
}
onMouseYChanged: {
var dy = mouseY - previousY
mainWindow.setY(mainWindow.y + dy)
}
}
}
main.cpp
只需添加
MacWindow::removeTitlebarFromWindow();
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "macos.h"
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQmlApplicationEngine engine;
const QUrl url(u"qrc:/qt-macos-without-title/main.qml"_qs);
QObject::connect(&engine, &QQmlApplicationEngine::objectCreated,
&app, [url](QObject *obj, const QUrl &objUrl) {
if (!obj && url == objUrl)
QCoreApplication::exit(-1);
}, Qt::QueuedConnection);
engine.load(url);
MacOS::removeTitlebarFromWindow();
return app.exec();
}
最后在 .pro 文件中包含 Cocoa 库
yourapp.pro
...
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