Так как 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 думаю Вы и сами знаете…