Plattform-Fensteranpassungs-Framework für QT-Widgets und QT Quick.
Dieses Projekt erbte den größten Teil der Wangwenx190 FramelessHelper -Implementierung mit einer vollständigen Refactoring und Upgrade der Architektur.
Feature -Anfragen sind willkommen.
Sie können Ihre Ergebnisse, Gedanken und Ideen zur Verbesserung / Implementierung von QWindowkit -Funktionen auf weiteren Plattformen und Apps teilen!


| macos | Linux (Ubuntu 20.04) |
|---|---|
![]() | ![]() |
Jami ist eine kostenlose/libre-, End-to-End-verschlüsselte und private Kommunikationssoftware.
Tietie ist eine einfache und einfach zu verwendende Software für Zwischenablageverwaltung. Support für Multiformat, leistungsstarke Suchfähigkeit.
| Komponente | Erfordernis | Details |
|---|---|---|
| Qt | > = 5.12 | Kern, GUI, Widgets, schnell |
| Compiler | > = C ++ 17 | MSVC 2019, GCC, Clang |
| Cmake | > = 3.19 | > = 3.20 wird empfohlen |
Bitte lesen Sie Schwachstellen sorgfältig durch, um detaillierte Anforderungen zu erfassen.
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 Lesen Sie die root CMakeLists.txt , um weitere Build -Optionen zu erhalten.
Sie können dieses Verzeichnis auch als Unterprojekt einfügen, wenn Sie CMake als Build -System auswählen.
Für andere Build -Systeme müssen Sie zuerst mit CMAKE installieren und die entsprechenden Konfigurationsdateien in Ihr Projekt einbeziehen.
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" )Detaillierte Verwendungen finden Sie unter Visual Studio Guide.
Die folgende Initialisierung sollte vor einem Widget -Konstrukt erfolgen.
# include < QtWidgets/QApplication >
int main ( int argc, char *argv[])
{
QGuiApplication::setAttribute (Qt::AA_DontCreateNativeWidgetSiblings)
// ...
} Erstens, Setup WidgetWindowAgent für Ihre Top QWidget -Instanz. (Jedes Fenster braucht seinen eigenen Agenten.)
# include < QWKWidgets/widgetwindowagent.h >
MyWidget::MyWidget (QWidget *parent) {
// ...
auto agent = new QWK::WidgetWindowAgent ( this );
agent-> setup ( this );
// ...
}Wenn Sie keine neue Widget -Klasse ableiten oder den Konstruktor ändern möchten, können Sie den Agenten nach den Fensterkonstrukten initialisieren.
auto w = new MyWidget();
auto agent = new QWK::WidgetWindowAgent(w);
agent-> setup (w); Sie sollten QWK::WidgetWindowAgent::setup() so früh wie möglich anrufen, insbesondere wenn Sie die Größenbeschränkungen festlegen müssen. QWindowkit ändert einige interne QT -Daten, die sich auf die Berechnung der Fenstergröße auswirken, und Sie müssen daher QWindowkit zu Beginn initialisieren lassen.
Konstruieren Sie dann Ihr Titelbalken -Widget, ohne das dem Fenster die grundlegende Interaktionsfunktion fehlt, und es ist besser, es in das Layout des Fensters zu stecken.
Sie können die von Widgetframe von WidgetFrame bereitgestellte WindowBar verwenden, die als Container Ihrer Titelbalkenkomponenten.
Lassen Sie WidgetWindowAgent wissen, welches Widget die Titelleiste ist.
agent-> setTitleBar (myTitleBar); Setzen Sie als nächstes die Taste der System -Taste fest, dass WidgetWindowAgent die Rolle der Kinder -Widgets informiert, was für das Layout von SNAP wichtig ist.
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 ());Dies bedeutet nicht, dass die Klickereignisse dieser Schaltflächen automatisch mit Fensteraktionen zugeordnet sind. Sie müssen die Signale und Slots immer noch manuell anschließen, um das native Fensterverhalten zu emulieren.
Bei macOS kann dieser Schritt übersprungen werden, da es besser ist, die vom System bereitgestellten Schaltflächen zu verwenden.
Last but not least den sichtbaren Treffer des Hit-Tests, um WidgetWindowAgent mitzuteilen, welche Widgets bereit sind, Mausereignisse zu erhalten.
agent-> setHitTestVisible (myTitleBar-> menuBar (), true);Die Restregion innerhalb der Titelleiste wird als draggierbarer Bereich angesehen, in dem der Benutzer das Fenster verschieben kann, und somit erhalten alle Qwidgets im Inneren keine Benutzer -Interaktionsereignisse wie Mausereignisse/Fokusereignisse/usw., aber Sie können diese Ereignisse immer noch über diese Widgets über die API von QT oder System -API an diese Widgets senden/veröffentlichen.
Qt::WindowMaximizeButtonHint aus dem Fenster entfernen. Stellen Sie sicher, dass Sie QWindowKit in Qtquick registriert haben:
# include < QWKQuick/qwkquickglobal.h >
int main ( int argc, char *argv[])
{
// ...
QQmlApplicationEngine engine;
// ...
QWK::registerTypes (&engine);
// ...
} Anschließend können Sie QWindowKit -Datentypen und Klassen durch Importieren seiner URI verwenden:
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
// ...
}
}Sie können die Versionsnummer weglassen oder "automatisch" anstelle von "1.0" für das Modul -URI verwenden, wenn Sie QT6 verwenden.
Wie bereits erwähnt, wird dies nach windowAgent.setup() aufgerufen, wenn Sie die Größenbeschränkungen einstellen möchten.
Beispiele finden Sie für weitere Demo -Anwendungsfälle. Die Beispiele haben keine hohe DPI -Unterstützung.
Qt::WA_NativeWindow -Eigenschaft hinzufügen möchten, die als Nachkommen des rahmenlosen Fensters aktiviert sind, sollten Sie Qt::WA_DontCreateNativeAncestors im Voraus aktivieren. GetWindowRect oder GetClientRect verwenden. Die Grundursache liegt tief in QT -QPA -Implementierungen, und derzeit wissen wir nicht, wie wir sie beheben können, ohne QT selbst zu ändern. Qwindowkit ist unter der Apache 2.0 -Lizenz lizenziert.