Marco de personalización de la ventana multiplataforma para widgets QT y QT rápido.
Este proyecto heredó la mayor parte de la implementación de Wangwenx190 FramelessHelper, con una refactorización completa y actualización de la arquitectura.
Las solicitudes de funciones son bienvenidas.
¡Puede compartir sus hallazgos, pensamientos e ideas para mejorar / implementar funcionalidades de Qwindowkit en más plataformas y aplicaciones!


| macosa | Linux (Ubuntu 20.04) |
|---|---|
![]() | ![]() |
Jami es un software gratuito/libre, de extremo a extremo cifrado y de comunicación privada.
Tietie es un software de administración de portapapeles simple y fácil de usar. Soporte multiformato, capacidad de búsqueda poderosa.
| Componente | Requisito | Detalles |
|---|---|---|
| QT | > = 5.12 | Núcleo, GUI, widgets, rápido |
| Compilador | > = C ++ 17 | MSVC 2019, GCC, Clang |
| CMake | > = 3.19 | > = 3.20 se recomienda |
Lea cuidadosamente las vulnerabilidades para adquirir requisitos detallados.
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 Lea la raíz CMakeLists.txt para obtener más opciones de compilación.
También puede incluir este directorio como subproyecto si elige CMake como su sistema de compilación.
Para otros sistemas de compilación, debe instalar primero con Cmake e incluir los archivos de configuración correspondientes en su proyecto.
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" )Consulte la Guía de Visual Studio para obtener usos detallados.
La siguiente inicialización debe hacerse antes de que se construya cualquier widget.
# include < QtWidgets/QApplication >
int main ( int argc, char *argv[])
{
QGuiApplication::setAttribute (Qt::AA_DontCreateNativeWidgetSiblings)
// ...
} Primero, configure WidgetWindowAgent para su instancia QWidget superior. (Cada ventana necesita su propio agente).
# include < QWKWidgets/widgetwindowagent.h >
MyWidget::MyWidget (QWidget *parent) {
// ...
auto agent = new QWK::WidgetWindowAgent ( this );
agent-> setup ( this );
// ...
}Si no desea obtener una nueva clase de widget o cambiar el constructor, puede inicializar el agente después de que se construye la ventana.
auto w = new MyWidget();
auto agent = new QWK::WidgetWindowAgent(w);
agent-> setup (w); Debe llamar QWK::WidgetWindowAgent::setup() lo antes posible, especialmente cuando necesita establecer las restricciones de tamaño. QWindowkit cambiará algunos datos internos QT que afectarán cómo el QT calcula el tamaño de la ventana y, por lo tanto, debe dejar que Qwindowkit se inicie desde el principio.
Luego, construya su widget de barra de título, sin el cual la ventana carece de la función de interacción básica, y es mejor ponerlo en el diseño de la ventana.
Puede usar la WindowBar proporcionada por WidgetFrame en los ejemplos como el contenedor de los componentes de su barra de título.
Deje que WidgetWindowAgent sepa qué widget es la barra de título.
agent-> setTitleBar (myTitleBar); A continuación, configure el botón del sistema sugerencias para que WidgetWindowAgent conozca el papel de los widgets de los niños, lo cual es importante para que funcione el diseño rápido.
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 ());Hacer esto no significa que los eventos de clic de estos botones se asocien automáticamente con las acciones de la ventana, aún necesita conectar manualmente las señales y las ranuras para emular los comportamientos de la ventana nativa.
En MacOS, este paso se puede omitir porque es mejor usar los botones proporcionados por el sistema.
Por último, pero no menos importante, establezca una pista visible para hacer que WidgetWindowAgent sepa qué widgets están dispuestos a recibir eventos del mouse.
agent-> setHitTestVisible (myTitleBar-> menuBar (), true);La región REST dentro de la barra de título se considerará como el área arrastrable para que el usuario mueva la ventana, y por lo tanto, cualquier QWidgets dentro de ella no recibirá ningún evento de interacción del usuario, como eventos de mouse/eventos de enfoque/etc., pero aún puede enviar/publicar tales eventos a estos widgets manualmente, ya sea a través de QT API o API del sistema.
Qt::WindowMaximizeButtonHint desde la ventana. Asegúrese de haber registrado QWindowKit en Qtquick:
# include < QWKQuick/qwkquickglobal.h >
int main ( int argc, char *argv[])
{
// ...
QQmlApplicationEngine engine;
// ...
QWK::registerTypes (&engine);
// ...
} Luego puede usar los tipos y clases de datos QWindowKit importando su 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
// ...
}
}Puede omitir el número de versión o usar "Auto" en lugar de "1.0" para el URI del módulo si está usando QT6.
Como acabamos de mencionar anteriormente, si va a establecer las restricciones de tamaño, hágalo después de windowAgent.setup() .
Ver ejemplos para más casos de uso de demostración. Los ejemplos no tienen un alto soporte de DPI.
Qt::WA_NativeWindow habilitada como descendiente de la ventana sin marco, debe habilitar Qt::WA_DontCreateNativeAncestors de la misma de antemano. GetWindowRect o GetClientRect . La causa raíz se encuentra profundamente en las implementaciones de QT QPA y actualmente no sabemos cómo solucionarlo sin modificar el QT en sí. QWindowkit tiene licencia bajo la licencia Apache 2.0.