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に子供ウィジェットの役割を知らせることができます。これは、スナップレイアウトが機能するために重要です。
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では、システムが提供するボタンを使用する方が良いため、このステップをスキップできます。
最後になりましたが、 WidgetWindowAgentにマウスイベントを受け取る意思のあるウィジェットをWidgetWindowagentに知らせるように、ヒットテストの表示可能なヒントを設定します。
agent-> setHitTestVisible (myTitleBar-> menuBar (), true);タイトルバー内の残りの領域は、ユーザーがウィンドウを移動するためのドラッグ可能な領域と見なされます。したがって、その内部のqwidgetは、マウスイベント/フォーカスイベントなどのユーザーインタラクションイベントを受け取りませんが、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を使用している場合、モジュールURIのバージョン番号を省略するか、「1.0」ではなく「自動」を使用できます。
上記のように、サイズの制約を設定する場合は、 windowAgent.setup()が呼び出された後にしてください。
その他のデモユースケースについては、例を参照してください。例には、DPIの高いサポートがありません。
Qt::WA_NativeWindowプロパティを備えたウィジェットを追加しようとしている場合は、事前にQt::WA_DontCreateNativeAncestors有効にする必要があります。 GetWindowRectやGetClientRectなどのシステムAPIを使用して、これを回避できます。根本的な原因はQT QPAの実装に深くあり、現在、QT自体を変更せずに修正する方法がわかりません。 Qwindowkitは、Apache 2.0ライセンスに基づいてライセンスされています。