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.

урок