Estrutura de personalização da janela de plataforma cruzada para widgets QT e QT rápido.
Este projeto herdou a maior parte da implementação Wangwenx190 FramelessHelper, com uma refatoração e atualização completa da arquitetura.
As solicitações de recursos são bem -vindas.
Você pode compartilhar suas descobertas, pensamentos e idéias sobre como melhorar / implementar funcionalidades QWindowkit em mais plataformas e aplicativos!


| macos | Linux (Ubuntu 20.04) |
|---|---|
![]() | ![]() |
Jami é um software de comunicação privado e de ponta a ponta, de ponta a ponta.
Tietie é um software de gerenciamento de quadro de transferência simples e fácil de usar. Suporte de vários formatos, capacidade de pesquisa poderosa.
| Componente | Exigência | Detalhes |
|---|---|---|
| Qt | > = 5.12 | Núcleo, gui, widgets, rápido |
| Compilador | > = C ++ 17 | MSVC 2019, GCC, CLANG |
| Cmake | > = 3,19 | > = 3,20 é recomendado |
Leia as vulnerabilidades cuidadosamente para adquirir requisitos detalhados.
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 Leia os CMakeLists.txt root para obter mais opções de construção.
Você também pode incluir este diretório como um subprojeto se escolher o CMake como seu sistema de compilação.
Para outros sistemas de construção, você precisa instalar com o CMake primeiro e incluir os arquivos de configuração correspondentes em seu projeto.
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 Guia do Visual Studio para obter usos detalhados.
A inicialização a seguir deve ser feita antes de qualquer construção de widgets.
# include < QtWidgets/QApplication >
int main ( int argc, char *argv[])
{
QGuiApplication::setAttribute (Qt::AA_DontCreateNativeWidgetSiblings)
// ...
} Primeiro, configure WidgetWindowAgent para a sua principal instância QWidget . (Cada janela precisa de seu próprio agente.)
# include < QWKWidgets/widgetwindowagent.h >
MyWidget::MyWidget (QWidget *parent) {
// ...
auto agent = new QWK::WidgetWindowAgent ( this );
agent-> setup ( this );
// ...
}Se você não deseja derivar uma nova classe de widget ou alterar o construtor, poderá inicializar o agente após a construção da janela.
auto w = new MyWidget();
auto agent = new QWK::WidgetWindowAgent(w);
agent-> setup (w); Você deve ligar para QWK::WidgetWindowAgent::setup() o mais cedo possível, especialmente quando precisar definir o tamanho restringe. O QWindowkit alterará alguns dados internos do QT que afetarão como o QT calcula o tamanho da janela e, portanto, você precisa permitir que o QWindowkit inicialize no início.
Em seguida, construa seu widget da barra de título, sem o qual a janela não possui o recurso de interação básica, e é melhor colocá -lo no layout da janela.
Você pode usar a WindowBar fornecida pelo WidgetFrame nos exemplos como o contêiner dos componentes da barra de título.
Informe WidgetWindowAgent qual é o widget a barra de título.
agent-> setTitleBar (myTitleBar); Em seguida, defina o botão do sistema dicas para deixar WidgetWindowAgent saber o papel dos widgets infantis, o que é importante para o layout do SNAP funcionar.
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 ());Isso não significa que os eventos de cliques desses botões estejam automaticamente associados às ações da janela, você ainda precisa conectar manualmente os sinais e slots para imitar os comportamentos da janela nativa.
No MacOS, esta etapa pode ser ignorada porque é melhor usar os botões fornecidos pelo sistema.
Por último, mas não menos importante, defina o teste de hit visível para informar WidgetWindowAgent quais widgets estão dispostos a receber eventos do mouse.
agent-> setHitTestVisible (myTitleBar-> menuBar (), true);A região restante da barra de título será considerada a área de arrasto para o usuário mover a janela e, portanto, qualquer Qwidgets dentro dela não receberá eventos de interação do usuário, como eventos de mouse/eventos de foco/etc, mas você ainda pode enviar/publicar esses eventos para esses widgets manualmente, por meio da API QT ou API do sistema.
Qt::WindowMaximizeButtonHint da janela. Certifique -se de registrar QWindowKit no qtquick:
# include < QWKQuick/qwkquickglobal.h >
int main ( int argc, char *argv[])
{
// ...
QQmlApplicationEngine engine;
// ...
QWK::registerTypes (&engine);
// ...
} Em seguida, você pode usar os tipos e classes de dados QWindowKit , importando seu 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
// ...
}
}Você pode omitir o número da versão ou usar "Auto" em vez de "1.0" para o URI do módulo se estiver usando o QT6.
Como acabamos de mencionar acima, se você for definir as restrições de tamanho, faça -o depois que windowAgent.setup() é chamado.
Veja exemplos para mais casos de uso de demonstração. Os exemplos não têm suporte de DPI alto.
Qt::WA_NativeWindow ativada como descendente da janela sem moldura, você deve ativar Qt::WA_DontCreateNativeAncestors com antecedência. GetWindowRect ou GetClientRect . A causa raiz está profundamente nas implementações QPA QPA e, atualmente, não sabemos como corrigi -lo sem modificar o próprio QT. QWindowkit está licenciado sob a licença Apache 2.0.