QML - Урок 008
Когато превеждах интерфейса на приложението отQt/C++ наQt/QML, ръцете ми стигнаха до иконата на приложението в системната област. Задачата беше частично или изцяло да се прехвърли иконата вSystem Tray отC++ къмQml,. Първата опция, която внедрих, беше обвивка околоQSystemTrayIcon сQMenu, използвайки система от сигнали и слотове. Решението е съвсем логично, като се има предвид, чеQML няма готов обект катоMenuBar заSystem Tray. Следователно, ние правим обвивка, с която може да се взаимодейства от слояQML.
След внедряването на обвивката имах възможност да се консултирам с програмиста наWargamming Константин Ляшкевич, който ми препоръча да обърна внимание и на факта, чеQML може да има достъп не само до сигнали и слотове, но и до параметритеQ_PROPERTY,, които също бяха налични в класаQSystemTrayIcon,, т.е. всъщност беше възможно само да регистрирате този клас като тип в слояQML и да опитате да напишете почти целия код вQML. Тествах този съвет и казах на Константин за резултата. В резултат на това самият той се заинтересува от тази задача и ние прекарахме вечерния час в забавно изчисляване на разходите и заедно напълнихмеQSystemTrayIcon колкото е възможно повече вQML.
Така в тази статия ще видите две реализации за работа с иконата в системната област.
Полученото приложение ще бъде минимизирано доСистемна област чрез щракване върху иконата в областта, както и чрез щракване върху бутона за затваряне на прозореца. Но само ако е активно специално квадратче за отметка, за да контролира процеса на минимизиране на прозореца на приложението в трея, ако квадратчето за отметка не е активно, тогаваприложението ще се затвори. Също така, приложението може да бъде затворено, когато квадратчето за отметка е активно чрез елемента от менюто в иконата на системната област.
Първи вариант
Възможност за работа със системния трей чрез wrapper клас.
Структура на проекта за работа със System Tray
Проектът включва следните файлове:
- QmlSystemTray.pro - профил на проекта;
- main.cpp - основният файл с изходен код за стартиране на приложението;
- systemtray.h - заглавен файл на класа за работа със системния трей;
- systemtray.cpp - файл с изходен код на клас за работа със системния трей;
- main.qml - файл с главния прозорец на приложението;
- logo-min.png - всяка икона, която ще бъде поставена в системната област.
QmlSystemTray.pro
systemtray.h
В заглавния файл на класаSystemTray ние декларираме сигнали, които ще предават информация къмQML, както и обектаQSystemTrayIcon,, с който ще се осъществява взаимодействие. В допълнение, ние декларираме манипулатор на взаимодействие с тази икона.
systemtray.cpp
След това пишем изходния код на класа за работа сSystem Tray, но прилагаме сигнализиране само при взаимодействие с елементи от менюто и иконата в системната област. Логиката за обработка на сигнала ще бъде внедрена вQML.
За да получим достъп до свойствата на обекта от класаSystemTray в слояQml, ние записваме обектаConnections,, чрез който се осъществява връзката с обектаSystemTray в целевото свойство, ние записваме името, което е декларирано във файла main.cpp, когато е установен достъп до обекта в системната област в двигателяQml чрезsetContextProperty() метод.
Втори вариант
Структурапроект
В този случай структурата на проекта ще се състои само от:
- QmlSystemTray.pro - профил на проекта;
- main.cpp - основният файл с изходен код за стартиране на приложението;
- main.qml - файл с главния прозорец на приложението;
- logo-min.png - всяка икона, която ще бъде поставена в системната област.
QmlSystemTray_2.pro
В този случай препоръчвам да обърнете внимание на модулите, които са свързани в проекта. Защото не можете без модула quickwidgets.
Също така е необходимо да включите библиотекатаQQuickWidget в изходния файлmain.cpp. Това е необходимо, за да използвате функциятаqmlRegisterType.