QSystemTrayIcon drag-and-drop как?

Хочется обрабатывать drag-n-grop файла на иконку системного трея в приложении на Qt.

Гугление дало:
Вот тут говорят это не нужно и невозможно, однако при ссылке на droplr успокаиваются и ретируются.
Вот тут уже интереснее. Советуют сделать прозрачный виджет поверх иконки трея. Однако я не уверен как оно будет себя вести при смене фокуса и изменении положения трея, поэтому остерегаюсь такого костыля.

Может как-то можно с наследованием поиграть, или у кого есть реализация уже? Главным требованием являлось бы поддержка хотя бы двух ОС: Linux (GNOME, KDE) и MacOS. Ну а Windows лишним не будет.
  • Вопрос задан
  • 3363 просмотра
Решения вопроса 1
vitaly_KF
@vitaly_KF
Разработчик Qt/C++
Так как QSystemTrayIcon всё же нследуется от QObject, то обрабатывать события предназначенные для QWidget он всё же не может. Думаю вариант с прозрачным виджетом вполне подходит. Нет возможности получать от иконки какие-либо события, вроде показа/скрытия, но всё же можно получить его геометрию через
QRect QSystemTrayIcon::geometry () const

А следовательно можно унаследоваться от QSystemTrayIcon, переопределить
void QObject::timerEvent ( QTimerEvent * event ) [virtual protected]

и периодически опрашивать геометрию иконки, чтобы перемещать наш прозрачный виджет…

ну что-то вроде:
#include <QSystemTrayIcon>

 class MySystemTrayIcon : public QSystemTrayIcon, QWidget
 {
     Q_OBJECT

 public:
     MySystemTrayIcon(QObject *parent = 0);

 protected:
     void timerEvent(QTimerEvent *event);
 };

 MySystemTrayIcon::MySystemTrayIcon(QObject *parent)
     : QSystemTrayIcon(parent), QWidget(0)
 {
     startTimer(1000);   // 1-second timer
 }

 void MySystemTrayIcon::timerEvent(QTimerEvent *event)
 {
     QWidget::setGeometry (QSystemTrayIcon::geometry());
 }


Не фонтан конечно, но вполне работоспособно… Как ужа не этот виджет вешать drag-and-drop думаю Вы и сами знаете…
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы