diff --git a/QtScrcpy/MainWindow.qml b/QtScrcpy/MainWindow.qml index 83c0ed6..b526d5c 100644 --- a/QtScrcpy/MainWindow.qml +++ b/QtScrcpy/MainWindow.qml @@ -1,10 +1,11 @@ import QtQuick 2.12 import QtQuick.Window 2.12 +import barry.uibase 1.0 Window { id: root visible: true - flags: Qt.Window | Qt.WindowMaximizeButtonHint | (Qt.platform.os == "windows" ? Qt.FramelessWindowHint : 0) + flags: Qt.Window | (Qt.platform.os == "windows" ? (Qt.FramelessWindowHint | Qt.WindowMaximizeButtonHint) : 0) width: 800 height: 600 color: "transparent" @@ -14,6 +15,10 @@ Window { property color backgroundColor: "#2E2F30" property color backgroundBorderColor: "#555656" + WindowFramelessHelperMac { + target: root; + } + Rectangle { id: backgroundView anchors.fill: parent diff --git a/QtScrcpy/main.cpp b/QtScrcpy/main.cpp index 993168a..48018f1 100644 --- a/QtScrcpy/main.cpp +++ b/QtScrcpy/main.cpp @@ -12,6 +12,7 @@ #include "mousetap/mousetap.h" #include "stream.h" #include "windowframelesshelper.h" +#include "windowframelesshelpermac.h" static Dialog *g_mainDlg = Q_NULLPTR; @@ -74,6 +75,9 @@ int main(int argc, char *argv[]) g_oldMessageHandler = qInstallMessageHandler(myMessageOutput); Stream::init(); QApplication app(argc, argv); + + qmlRegisterType("barry.uibase", 1, 0, "WindowFramelessHelperMac"); + QQmlApplicationEngine engine("qrc:/MainWindow.qml"); #ifdef Q_OS_WIN32 diff --git a/QtScrcpy/uibase/uibase.pri b/QtScrcpy/uibase/uibase.pri index 1a29b2d..ec36fae 100644 --- a/QtScrcpy/uibase/uibase.pri +++ b/QtScrcpy/uibase/uibase.pri @@ -3,10 +3,12 @@ FORMS += HEADERS += \ $$PWD/keepratiowidget.h \ $$PWD/magneticwidget.h \ - $$PWD/windowframelesshelper.h + $$PWD/windowframelesshelper.h \ + $$PWD/windowframelesshelpermac.h SOURCES += \ $$PWD/keepratiowidget.cpp \ $$PWD/magneticwidget.cpp \ - $$PWD/windowframelesshelper.cpp + $$PWD/windowframelesshelper.cpp \ + $$PWD/windowframelesshelpermac.mm diff --git a/QtScrcpy/uibase/windowframelesshelpermac.h b/QtScrcpy/uibase/windowframelesshelpermac.h new file mode 100644 index 0000000..6320f48 --- /dev/null +++ b/QtScrcpy/uibase/windowframelesshelpermac.h @@ -0,0 +1,24 @@ +#ifndef WINDOWFRAMELESSHELPERMAC_H +#define WINDOWFRAMELESSHELPERMAC_H + +#include + +class WindowFramelessHelperMac : public QObject +{ + Q_OBJECT + Q_PROPERTY(QQuickWindow * target READ target WRITE setTarget NOTIFY targetChanged) + +public: + explicit WindowFramelessHelperMac(QObject *parent = nullptr); + + QQuickWindow *target() const; + void setTarget(QQuickWindow *target); + +signals: + void targetChanged(); + +private: + QQuickWindow* m_target = nullptr; +}; + +#endif // WINDOWFRAMELESSHELPERMAC_H diff --git a/QtScrcpy/uibase/windowframelesshelpermac.mm b/QtScrcpy/uibase/windowframelesshelpermac.mm new file mode 100644 index 0000000..9c4a01a --- /dev/null +++ b/QtScrcpy/uibase/windowframelesshelpermac.mm @@ -0,0 +1,49 @@ +#include "windowframelesshelpermac.h" + +#include +#include + +WindowFramelessHelperMac::WindowFramelessHelperMac(QObject *parent) : QObject(parent) +{ + +} + +QQuickWindow *WindowFramelessHelperMac::target() const +{ + return m_target; +} + +void WindowFramelessHelperMac::setTarget(QQuickWindow *target) +{ + if (target == m_target) { + return; + } + m_target = target; + + //如果当前osx版本老于10.9,则后续代码不可用。转为使用定制的系统按钮,不支持自由缩放窗口及窗口阴影 + if (QOperatingSystemVersion::current() < QOperatingSystemVersion::OSXYosemite) { + return; + } + + NSView* view = (NSView*)target->winId(); + if (nullptr == view) { + return; + } + + NSWindow *window = view.window; + if (nullptr == window) { + return; + } + + //设置标题文字和图标为不可见 + window.titleVisibility = NSWindowTitleHidden; + //设置标题栏为透明 + window.titlebarAppearsTransparent = YES; + //设置不可由标题栏拖动,避免与自定义拖动冲突 + window.movable = NO; + window.hasShadow = YES; + //设置view扩展到标题栏 + window.styleMask |= NSWindowStyleMaskFullSizeContentView; + + emit targetChanged(); +}