Крестоплатформенная структура настройки окна для виджетов QT и QT Quick.
Этот проект унаследовал большую часть реализации Wangwenx190 FramelessHelper, с полной рефакторией и обновлением архитектуры.
Запросы на функции приветствуются.
Вы можете поделиться своими выводами, мыслями и идеями по улучшению / внедрению функций Qwindowkit на большем количестве платформ и приложений!


| macOS | Linux (Ubuntu 20.04) |
|---|---|
![]() | ![]() |
Jami-это бесплатное/либерновое, сквозное зашифрованное и частное коммуникационное программное обеспечение.
Tietie - это простое и простое в использовании программное обеспечение для управления буфером обмена. Многоформатная поддержка, мощная поисковая способность.
| Компонент | Требование | Подробности |
|---|---|---|
| QT | > = 5,12 | Ядро, графический интерфейс, виджеты, быстрые |
| Компилятор | > = 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)
// ...
} Во -первых, настройка WidgetWindowAgent для вашего лучшего экземпляра QWidget . (Каждому окну нужен собственный агент.)
# 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 инициализации в самом начале.
Затем построите виджет напологона заголовка, без которого у окна отсутствует основная функция взаимодействия, и лучше положить его в макет окна.
Вы можете использовать WindowBar , предоставленную WidgetFrame в примерах в качестве контейнера ваших компонентов стержня.
Позвольте WidgetWindowAgent знать, какой виджет заглавный панель.
agent-> setTitleBar (myTitleBar); Затем установите намеки на системную кнопку, чтобы позволить WidgetWindowAgent знать роль детских виджетов, что важно для работы макета Snap.
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 , какие виджеты готовы получить события мыши.
agent-> setHitTestVisible (myTitleBar-> menuBar (), true);Область остальных в строке заголовка будет рассматриваться как область перетаскивания для пользователя, чтобы переместить окно, и, таким образом, любые Qwidgets внутри он не получат никаких событий взаимодействия с пользователем, таких как события мыши/фокусировки/и т. Д., Но вы все равно можете отправлять/публиковать такие события в эти виджеты вручную, либо через QT API API.
Qt::WindowMaximizeButtonHint из окна. Убедитесь, что вы зарегистрировали QWindowKit в Qtquick:
# include < QWKQuick/qwkquickglobal.h >
int main ( int argc, char *argv[])
{
// ...
QQmlApplicationEngine engine;
// ...
QWK::registerTypes (&engine);
// ...
} Затем вы можете использовать типы и классы данных QWindowKit , импортируя его 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
// ...
}
}Вы можете опустить номер версии или использовать «Авто» вместо «1.0» для модуля URI, если вы используете QT6.
Как мы только что упоминали выше, если вы собираетесь установить ограничения размера, пожалуйста, сделайте это после windowAgent.setup() .
См. Примеры для более демо -вариантов использования. Примеры не имеют высокой поддержки DPI.
Qt::WA_NativeWindow включенным в качестве потомка безрамного окна, вы должны включить Qt::WA_DontCreateNativeAncestors этого заранее. GetWindowRect или GetClientRect . Корская причина лежит глубоко в реализациях QT QPA, и в настоящее время мы не знаем, как ее исправить без изменения самого QT. Qwindowkit лицензирован по лицензии Apache 2.0.