QT小部件和QT快速的跨平台窗口自定義框架。
該項目繼承了Wangwenx190 FramelessHelper實現的大部分,並完全重構和升級了體系結構。
歡迎功能請求。
您可以在更多平台和應用程序上分享有關改進 /實施Qwindowkit功能的發現,想法和想法!


| macos | Linux(Ubuntu 20.04) |
|---|---|
![]() | ![]() |
Jami是免費的/libre,端到端加密和私人通信軟件。
Tietie是一種易於使用的剪貼板管理軟件。多格式支持,強大的搜索能力。
| 成分 | 要求 | 細節 |
|---|---|---|
| QT | > = 5.12 | 核心,GUI,小部件,快速 |
| 編譯器 | > = C ++ 17 | MSVC 2019,GCC,Clang |
| cmake | > = 3.19 | > = 3.20建議使用 |
請仔細閱讀漏洞以獲取詳細的要求。
git clone --recursive https://github.com/stdware/qwindowkit
cd qwindowkit
cmake -B build -S .
-Dqmsetup_DIR= < dir > # Optional
-DQWINDOWKIT_BUILD_QUICK=TRUE # Optional
-DCMAKE_INSTALL_PREFIX=/path/install
-G " Ninja Multi-Config "
cmake --build build --target install --config Debug
cmake --build build --target install --config Release閱讀root CMakeLists.txt以獲取更多構建選項。
如果選擇cmake作為構建系統,則還可以將此目錄作為子標點包含。
對於其他構建系統,您需要先使用CMAKE安裝,並在項目中包含相應的配置文件。
cmake -B build -DQWindowKit_DIR=/path/install/lib/cmake/QWindowKit find_package (QWindowKit COMPONENTS Core Widgets Quick REQUIRED)
target_link_libraries (widgets_app PUBLIC QWindowKit::Widgets)
target_link_libraries (quick_app PUBLIC QWindowKit::Quick) # WidgetsApp.pro
include ( "/path/install/share/QWindowKit/qmake/QWKWidgets.pri" )
# QuickApp.pro
include ( "/path/install/share/QWindowKit/qmake/QWKQuick.pri" )有關詳細用途,請參見Visual Studio指南。
應在任何小部件構造之前進行以下初始化。
# include < QtWidgets/QApplication >
int main ( int argc, char *argv[])
{
QGuiApplication::setAttribute (Qt::AA_DontCreateNativeWidgetSiblings)
// ...
}首先,為您的頂級QWidget實例設置WidgetWindowAgent 。 (每個窗口都需要自己的代理。)
# include < QWKWidgets/widgetwindowagent.h >
MyWidget::MyWidget (QWidget *parent) {
// ...
auto agent = new QWK::WidgetWindowAgent ( this );
agent-> setup ( this );
// ...
}如果您不想得出新的小部件類或更改構造函數,則可以在窗口構造之後初始化代理。
auto w = new MyWidget();
auto agent = new QWK::WidgetWindowAgent(w);
agent-> setup (w);您應該儘早調用QWK::WidgetWindowAgent::setup() ,尤其是當您需要設置大小約束時。 Qwindowkit將會更改一些QT內部數據,這將影響QT計算窗口大小的方式,因此您需要在一開始就讓Qwindowkit初始化。
然後,構建您的標題欄窗口小部件,沒有該小部件,窗口缺乏基本的交互功能,最好將其放入窗口的佈局中。
您可以在示例中使用WidgetFrame提供的WindowBar作為標題欄組件的容器。
讓WidgetWindowAgent知道標題欄是哪個窗口小部件。
agent-> setTitleBar (myTitleBar);接下來,設置系統按鈕提示以讓WidgetWindowAgent知道兒童小部件的作用,這對於SNAP佈局工作非常重要。
agent-> setSystemButton (QWK::WindowAgentBase::WindowIcon, myTitleBar-> iconButton ());
agent-> setSystemButton (QWK::WindowAgentBase::Minimize, myTitleBar-> minButton ());
agent-> setSystemButton (QWK::WindowAgentBase::Maximize, myTitleBar-> maxButton ());
agent-> setSystemButton (QWK::WindowAgentBase::Close, myTitleBar-> closeButton ());這樣做並不意味著這些按鈕的點擊事件會自動與窗口操作相關聯,您仍然需要手動連接信號和插槽以模擬本機窗口行為。
在MacOS上,可以跳過此步驟,因為最好使用系統提供的按鈕。
最後但並非最不重要的一點是,設置HIT測試可見提示,讓WidgetWindowAgent知道哪些小部件願意接收鼠標事件。
agent-> setHitTestVisible (myTitleBar-> menuBar (), true);標題欄內的其餘區域將被視為用戶移動窗口的可拖動區域,因此,內部的任何QWIDGETS都不會再接收任何用戶交互事件,例如鼠標事件/focus Events/etc,但是您仍然可以通過QT API或系統API手動將此類事件發送到這些窗口小組。
Qt::WindowMaximizeButtonHint標誌。確保已註冊QWindowKit到Qtquick:
# include < QWKQuick/qwkquickglobal.h >
int main ( int argc, char *argv[])
{
// ...
QQmlApplicationEngine engine;
// ...
QWK::registerTypes (&engine);
// ...
}然後,您可以通過導入其URI來使用QWindowKit數據類型和類:
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 {
id : windowAgent
// ...
}
}如果您使用的是QT6,則可以省略版本號或使用“自動”代替“ 1.0”。
如上所述,如果您要設置大小約束,請在windowAgent.setup()之後進行。
有關更多演示用例,請參見示例。這些示例沒有很高的DPI支持。
Qt::WA_NativeWindow屬性作為“無框窗口的後代”啟用的小部件,則應提前啟用Qt::WA_DontCreateNativeAncestors 。 GetWindowRect或GetClientRect解決此問題。根本原因在於QT QPA實現,目前我們不知道如何在不修改QT本身的情況下修復它。 Qwindowkit已獲得Apache 2.0許可證的許可。