Yuhang Zhao
2023-12-19 78f31c67d71ee743f022dd6f5930abae6f6d54f9
README.md
@@ -4,24 +4,38 @@
This project inherited most of [wangwenx190 FramelessHelper](https://github.com/wangwenx190/framelesshelper) implementation, with a complete refactoring and upgrading of the architecture.
## Screenshots
### Windows
![image](./docs/images/win32.png)
### Linux
![image](./docs/images/linux.png)
### macOS
![image](./docs/images/mac.png)
## TODO
+ Fix 5.15 window unsupported behavior
+ Fix 5.15 window abnormal behavior
+ Fix window 10 top border color in dark background
+ Fix `isFixedSize` code
+ Support customized system button area on Mac
+ Make Linux system move/resize more robust
+ Fix unhandled WinIdChange when adding a QWebEngineView as sub-widget (Win32 and Qt fixed)
+ Implement Mac window context hook
+ Support window attribute switching on Windows
## Supported Platforms
+ Microsoft Windows (Vista ~ 11)
+ Apple Mac OSX (11+)
+ GNU/Linux (Tested on Ubuntu)
+ Microsoft Windows
+ Apple macOS (11+)
+ GNU/Linux
## Requirements
| Component | Requirement |               Detailed               |
| Component | Requirement |               Details                |
|:---------:|:-----------:|:------------------------------------:|
|    Qt     |   \>=5.15   |      Core, Gui, Widgets, Quick       |
| Compiler  |  \>=C++17   |        MSVC 2019, GCC, Clang         |
@@ -31,8 +45,8 @@
+ Windows
  + MSVC: 2019, 2022
  + MinGW: 13.2.0
+ MacOSX
  + MinGW (GCC): 13.2.0
+ macOS
  + Clang 14.0.3
+ Ubuntu
  + GCC: 9.4.0
@@ -90,30 +104,37 @@
### Qt Widgets Application
First, setup `WidgetWindowAgent` for your QWidget instance. (Each widget needs its own agent.)
First, setup `WidgetWindowAgent` for your top `QWidget` instance. (Each window needs its own agent.)
```c++
auto w = new MyWidget();
auto agent = new WidgetWindowAgent(w);
agent->setup(w);
```
#include <QWKWidgets/widgetwindowagent.h>
You can also initialize the agent in the widget constructor.
```c++
MyWidget::MyWidget(QWidget *parent) {
    // ...
    auto agent = new WidgetWindowAgent(w);
    auto agent = new QWK::WidgetWindowAgent(w);
    agent->setup(w);
    // ...
}
```
Then, construct your title bar widget, without which the window is lacking in basic interaction feature. You can use the [`WindowBar`](examples/shared/widgetframe/windowbar.h) provided by `WidgetFrame` in the examples as the container for your title bar components.
You can also initialize the agent after the window constructs.
```c++
auto w = new MyWidget();
auto agent = new QWK::WidgetWindowAgent(w);
agent->setup(w);
```
Then, construct your title bar widget, without which the window lacks the basic interaction feature, and it's better to put it into the window's layout.
You can use the [`WindowBar`](examples/shared/widgetframe/windowbar.h) provided by `WidgetFrame` in the examples as the container of your title bar components.
Let `WidgetWindowAgent` know which widget the title bar is.
```c++
agent->setTitleBarWidget(myTitleBar);
```
Set system button hints to let `WidgetWindowAgent` know the role of the widgets, which is important for the Snap Layout to work.
Set system button hints to let `WidgetWindowAgent` know the role of the child widgets, which is important for the Snap Layout to work.
```c++
agent->setSystemButton(QWK::WindowAgent::Base::Maximize, maxButton);
```
@@ -122,13 +143,50 @@
```c++
agent->setHitTestVisible(myTitleBar->menuBar(), true);
```
Other region inside the title bar will be regarded as the draggable area for user to move the window.
The rest region within the title bar will be regarded as the draggable area for the user to move the window.
Check [`MainWindow`](examples/mainwindow/mainwindow.cpp#L108) example to get detailed information.
### Qt Quick Application
TODO
Make sure you have registered QWK into QtQuick:
```cpp
// ...
#include <QWKQuick/qwkquickglobal.h>
// ...
int main(int argc, char *argv[])
{
    // ...
    QQmlApplicationEngine engine;
    // ...
    QWK::registerTypes(&engine);
    // ...
}
```
Then you can use QWK data types and classes by importing it's URI:
```qml
import QtQuick 2.15
import QtQuick.Window 2.15
import QWindowKit 1.0
Window {
    id: window
    visible: false // We hide it first, so we can move the window to our desired position silently.
    Component.onCompleted: {
        windowAgent.setup(window)
        window.visible = true
    }
    WindowAgent {
      // ...
    }
}
```
You can omit the version number or use "auto" instead of "1.0" for the module URI if you are using Qt6.
### Learn More