Yuhang Zhao
2023-12-19 f9aa4aacae56e3a82bce492196ff1802f3ecaf02
README.md
@@ -6,12 +6,11 @@
## 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)
## Supported Platforms
@@ -56,7 +55,7 @@
cmake --build build --target install --config Release
```
You can also include this directory as a sub-project if you choose CMake as your build system.
You can also include this directory as a subproject if you choose CMake as your build system.
For other build systems, you need to install with CMake first and include the corresponding configuration files in your project.
@@ -64,13 +63,13 @@
#### CMake Project
```cmake
```sh
cmake -B build -DQWindowKit_DIR=/path/install/cmake/QWindowKit
```
```cmake
find_package(QWindowKit REQUIRED)
taraget_link_libraries(widgets_app PUBLIC QWindowKit::Widgets)
taraget_link_libraries(quick_app PUBLIC QWindowKit::Quick)
target_link_libraries(widgets_app PUBLIC QWindowKit::Widgets)
target_link_libraries(quick_app PUBLIC QWindowKit::Quick)
```
#### QMake Project
@@ -90,45 +89,46 @@
### 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++
#include <QWKWidgets/widgetwindowagent.h>
MyWidget::MyWidget(QWidget *parent) {
    // ...
    auto agent = new WidgetWindowAgent(w);
    agent->setup(w);
    // ...
}
```
You can also initialize the agent after the window constructs.
```c++
auto w = new MyWidget();
auto agent = new WidgetWindowAgent(w);
agent->setup(w);
```
You can also initialize the agent in the widget constructor.
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++
MyWidget::MyWidget(QWidget *parent) {
    // ...
    auto agent = new WidgetWindowAgent(w);
    agent->setup(w);
}
agent->setTitleBarWidget(myTitleBar);
```
Then, construct your titlebar 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 titlebar components.
Set system button hints to let `WidgetWindowAgent` know the role of the child widgets, which is important for the Snap Layout to work.
```c++
auto titleLabel = new QLabel();
auto menuBar = new QMenuBar();
auto windowBar = new QWK::WindowBar();
windowBar->setMenuBar(menuBar);
windowBar->setTitleLabel(titleLabel);
windowBar->setHostWidget(this);
auto iconButton = new QPushButton("😄");
auto minButton = new QPushButton("─");
auto maxButton = new QPushButton("▢");
auto closeButton = new QPushButton("✕");
agent->setSystemButton(QWK::WindowAgentBase::WindowIcon, iconButton);
agent->setSystemButton(QWK::WindowAgentBase::Minimize, minButton);
agent->setSystemButton(QWK::WindowAgentBase::Maximize, maxButton);
agent->setSystemButton(QWK::WindowAgentBase::Close, closeButton);
agent->setSystemButton(QWK::WindowAgent::Base::Maximize, maxButton);
```
Set hit-test visible hint to let `WidgetWindowAgent` know the widgets that desire to receive mouse events.
```c++
agent->setHitTestVisible(myTitleBar->menuBar(), true);
```
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
@@ -136,12 +136,12 @@
### Learn More
See [examples](examples) for more demo use cases. The examples has no High DPI support.
See [examples](examples) for more demo use cases. The examples have no High DPI support.
## Documentatons
## Documentations
+ Examples (TODO)
+ [Framelesshelper Related](docs/framelesshelper-related.md)
+ [FramelessHelper Related](docs/framelesshelper-related.md)
## License