diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt index d106427..db13084 100644 --- a/examples/CMakeLists.txt +++ b/examples/CMakeLists.txt @@ -4,6 +4,7 @@ find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets) if(TARGET Qt${QT_VERSION_MAJOR}::Widgets) add_subdirectory(widget) add_subdirectory(mainwindow) + add_subdirectory(minimal) endif() if(TARGET Qt${QT_VERSION_MAJOR}::Quick) diff --git a/examples/minimal/CMakeLists.txt b/examples/minimal/CMakeLists.txt new file mode 100644 index 0000000..4e846d3 --- /dev/null +++ b/examples/minimal/CMakeLists.txt @@ -0,0 +1,39 @@ +set(CMAKE_INCLUDE_CURRENT_DIR ON) + +set(CMAKE_AUTOUIC ON) +set(CMAKE_AUTOMOC ON) +set(CMAKE_AUTORCC ON) + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Widgets REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Widgets REQUIRED) + +set(SOURCES + ../images.qrc + main.cpp + flwindow.h + flwindow.cpp +) + +if(WIN32) + enable_language(RC) + list(APPEND SOURCES ../example.rc ../example.manifest) +endif() + +add_executable(minimal WIN32 ${SOURCES}) + +target_link_libraries(minimal PRIVATE + Qt${QT_VERSION_MAJOR}::Widgets + wangwenx190::FramelessHelper +) + +target_compile_definitions(minimal PRIVATE + QT_NO_CAST_FROM_ASCII + QT_NO_CAST_TO_ASCII + QT_NO_KEYWORDS + QT_DEPRECATED_WARNINGS + QT_DISABLE_DEPRECATED_BEFORE=0x060100 +) + +if(WIN32) + target_link_libraries(minimal PRIVATE dwmapi) +endif() diff --git a/examples/minimal/flwindow.cpp b/examples/minimal/flwindow.cpp new file mode 100644 index 0000000..137cf74 --- /dev/null +++ b/examples/minimal/flwindow.cpp @@ -0,0 +1,38 @@ +#include "flwindow.h" +#include "../../framelesshelper.h" + +FRAMELESSHELPER_USE_NAMESPACE + +FLWindow::FLWindow(QWidget *parent) : QWidget(parent) +{ + setWindowFlags(Qt::FramelessWindowHint | Qt::Dialog); + setStyleSheet(QString::fromLatin1("background:blue")); + + setAttribute(Qt::WA_ShowModal); + resize(500, 500); +} + +FLWindow::~FLWindow() +{ + +} + +void FLWindow::initFramelessWindow() +{ + FramelessHelper* helper = new FramelessHelper(windowHandle()); + helper->setResizeBorderThickness(8); + helper->setTitleBarHeight(20); + helper->setResizable(true); + helper->install(); +} + +void FLWindow::showEvent(QShowEvent *event) +{ + QWidget::showEvent(event); + + static bool inited = false; + if (!inited) { + inited = true; + initFramelessWindow(); + } +} \ No newline at end of file diff --git a/examples/minimal/flwindow.h b/examples/minimal/flwindow.h new file mode 100644 index 0000000..2fb26b0 --- /dev/null +++ b/examples/minimal/flwindow.h @@ -0,0 +1,17 @@ +#pragma once + +#include + +class FLWindow : public QWidget +{ + Q_OBJECT +public: + explicit FLWindow(QWidget *parent = nullptr); + ~FLWindow(); + +protected: + void showEvent(QShowEvent *event) override; + +private: + void initFramelessWindow(); +}; \ No newline at end of file diff --git a/examples/minimal/main.cpp b/examples/minimal/main.cpp new file mode 100644 index 0000000..d99e8ad --- /dev/null +++ b/examples/minimal/main.cpp @@ -0,0 +1,21 @@ +#include +#include "flwindow.h" + +int main(int argc, char *argv[]) +{ + QCoreApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); +#if (QT_VERSION < QT_VERSION_CHECK(6, 0, 0)) + QGuiApplication::setAttribute(Qt::AA_EnableHighDpiScaling); + QGuiApplication::setAttribute(Qt::AA_UseHighDpiPixmaps); +#if (QT_VERSION >= QT_VERSION_CHECK(5, 14, 0)) + QGuiApplication::setHighDpiScaleFactorRoundingPolicy(Qt::HighDpiScaleFactorRoundingPolicy::PassThrough); +#endif +#endif + + QApplication application(argc, argv); + + FLWindow win; + win.show(); + + return QApplication::exec(); +} diff --git a/framelesshelper.cpp b/framelesshelper.cpp index 4ee1ce8..d6d38e4 100644 --- a/framelesshelper.cpp +++ b/framelesshelper.cpp @@ -222,8 +222,11 @@ void FramelessHelper::unsetCursor() void FramelessHelper::updateCursor() { - if (isHoverResizeHandler()) + if (isHoverResizeHandler()) { setCursor(cursorForFrameSection(m_hoveredFrameSection)); + } else { + unsetCursor(); + } } void FramelessHelper::updateMouse(const QPoint& pos) @@ -239,6 +242,8 @@ void FramelessHelper::updateHoverStates(const QPoint& pos) bool FramelessHelper::eventFilter(QObject *object, QEvent *event) { + bool filterOut = false; + if (object == m_window) { switch (event->type()) { @@ -266,6 +271,8 @@ bool FramelessHelper::eventFilter(QObject *object, QEvent *event) break; } } + + return filterOut; } FRAMELESSHELPER_END_NAMESPACE diff --git a/framelesshelper.h b/framelesshelper.h index 62be8d3..358f151 100644 --- a/framelesshelper.h +++ b/framelesshelper.h @@ -29,6 +29,7 @@ #if (QT_VERSION >= QT_VERSION_CHECK(5, 15, 0)) #include +#include QT_BEGIN_NAMESPACE QT_FORWARD_DECLARE_CLASS(QWindow) diff --git a/framelesswindowsmanager.cpp b/framelesswindowsmanager.cpp index 093e8f7..c2874b2 100644 --- a/framelesswindowsmanager.cpp +++ b/framelesswindowsmanager.cpp @@ -38,7 +38,7 @@ FRAMELESSHELPER_BEGIN_NAMESPACE #ifdef FRAMELESSHELPER_USE_UNIX_VERSION -Q_GLOBAL_STATIC(FramelessHelper, framelessHelperUnix) +//Q_GLOBAL_STATIC(FramelessHelper, framelessHelperUnix) #endif void FramelessWindowsManager::addWindow(QWindow *window) @@ -51,7 +51,7 @@ void FramelessWindowsManager::addWindow(QWindow *window) QCoreApplication::setAttribute(Qt::AA_DontCreateNativeWidgetSiblings); } #ifdef FRAMELESSHELPER_USE_UNIX_VERSION - framelessHelperUnix()->removeWindowFrame(window); + //framelessHelperUnix()->removeWindowFrame(window); #else FramelessHelperWin::addFramelessWindow(window); // Work-around a Win32 multi-monitor bug. @@ -165,7 +165,7 @@ void FramelessWindowsManager::removeWindow(QWindow *window) return; } #ifdef FRAMELESSHELPER_USE_UNIX_VERSION - framelessHelperUnix()->bringBackWindowFrame(window); + //framelessHelperUnix()->bringBackWindowFrame(window); #else FramelessHelperWin::removeFramelessWindow(window); #endif