Framework de personnalisation de la fenêtre multiplateforme pour les widgets QT et QT Quick.
Ce projet a hérité de la majeure partie de la mise en œuvre de Wangwenx190 Framelesshelper, avec une refactorisation et une mise à niveau complètes de l'architecture.
Les demandes de fonctionnalités sont les bienvenues.
Vous pouvez partager vos résultats, vos pensées et vos idées sur l'amélioration / la mise en œuvre des fonctionnalités Qwindowkit sur plus de plateformes et d'applications!


| macos | Linux (Ubuntu 20.04) |
|---|---|
![]() | ![]() |
Jami est un logiciel gratuit / libre, de bout en bout, et de communication privée.
Tietie est un logiciel de gestion du presse-papiers simple et facile à utiliser. Prise en charge multi-format, puissante capacité de recherche.
| Composant | Exigence | Détails |
|---|---|---|
| QT | > = 5.12 | Core, GUI, widgets, rapide |
| Compilateur | > = C ++ 17 | MSVC 2019, GCC, Clang |
| Cmake | > = 3,19 | > = 3,20 est recommandé |
Veuillez lire attentivement les vulnérabilités pour acquérir des exigences détaillées.
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 Lisez la racine CMakeLists.txt pour plus d'options de construction.
Vous pouvez également inclure ce répertoire en tant que sous-projet si vous choisissez CMake comme système de construction.
Pour d'autres systèmes de construction, vous devez d'abord installer avec CMake et inclure les fichiers de configuration correspondants dans votre projet.
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" )Voir Visual Studio Guide pour des usages détaillés.
L'initialisation suivante doit être effectuée avant toute construction de widget.
# include < QtWidgets/QApplication >
int main ( int argc, char *argv[])
{
QGuiApplication::setAttribute (Qt::AA_DontCreateNativeWidgetSiblings)
// ...
} Tout d'abord, configurez WidgetWindowAgent pour votre instance QWidget supérieure. (Chaque fenêtre a besoin de son propre agent.)
# include < QWKWidgets/widgetwindowagent.h >
MyWidget::MyWidget (QWidget *parent) {
// ...
auto agent = new QWK::WidgetWindowAgent ( this );
agent-> setup ( this );
// ...
}Si vous ne souhaitez pas dériver une nouvelle classe de widget ou modifier le constructeur, vous pouvez initialiser l'agent après les constructions de la fenêtre.
auto w = new MyWidget();
auto agent = new QWK::WidgetWindowAgent(w);
agent-> setup (w); Vous devez appeler QWK::WidgetWindowAgent::setup() le plus tôt possible, surtout lorsque vous devez définir les contraintes de taille. Qwindowkit modifiera certaines données internes QT qui affecteront la façon dont QT calcule la taille de la fenêtre, et vous devez donc laisser Qwindowkit initialiser au tout début.
Ensuite, construisez votre widget de barre de titre, sans lesquels la fenêtre n'a pas la fonction d'interaction de base, et il est préférable de le mettre dans la disposition de la fenêtre.
Vous pouvez utiliser la WindowBar fournie par WidgetFrame dans les exemples comme conteneur de vos composants de barre de titre.
Faites savoir WidgetWindowAgent quel widget la barre de titre est.
agent-> setTitleBar (myTitleBar); Ensuite, définissez les conseils du bouton système pour permettre à WidgetWindowAgent de connaître le rôle des widgets enfants, ce qui est important pour que la mise en page du snap fonctionne.
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 ());Cela ne signifie pas que les événements de clics de ces boutons sont automatiquement associés aux actions de fenêtre, vous devez toujours connecter manuellement les signaux et les fentes pour imiter les comportements de fenêtre natifs.
Sur MacOS, cette étape peut être ignorée car il est préférable d'utiliser les boutons fournis par le système.
Enfin et non le moindre, définissez un indice visible à succès pour permettre WidgetWindowAgent de savoir quels widgets sont prêts à recevoir des événements de souris.
agent-> setHitTestVisible (myTitleBar-> menuBar (), true);La région de repos au sein de la barre de titre sera considérée comme la zone dragable pour que l'utilisateur déplace la fenêtre, et donc tous les Qwidgets à l'intérieur ne recevront plus d'événements d'interaction de l'utilisateur tels que les événements de souris / événements de mise au point / etc., mais vous pouvez toujours envoyer / publier ces événements à ces widgets manuellement, soit via API QT ou API système.
Qt::WindowMaximizeButtonHint de la fenêtre. Assurez-vous que vous avez enregistré QWindowKit dans QTQUICK:
# include < QWKQuick/qwkquickglobal.h >
int main ( int argc, char *argv[])
{
// ...
QQmlApplicationEngine engine;
// ...
QWK::registerTypes (&engine);
// ...
} Ensuite, vous pouvez utiliser des types de données et des classes QWindowKit en important son URI:
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
// ...
}
}Vous pouvez omettre le numéro de version ou utiliser "Auto" au lieu de "1.0" pour le module URI si vous utilisez QT6.
Comme nous venons de le mentionner ci-dessus, si vous voulez définir les contraintes de taille, veuillez le faire après que windowAgent.setup() est appelé.
Voir des exemples pour plus de cas d'utilisation de démonstration. Les exemples n'ont pas de support DPI élevé.
Qt::WA_NativeWindow Property activé comme un descendant de la fenêtre sans cadre, vous devez activer à l'avance Qt::WA_DontCreateNativeAncestors . GetWindowRect ou GetClientRect . La cause profonde réside profondément dans les implémentations QPA QT et actuellement nous ne savons pas comment le réparer sans modifier QT lui-même. Qwindowkit est sous licence sous la licence Apache 2.0.