Вот маленькое тестовое приложение:
MyApp.h
C++ (Qt)
#ifndef MYAPP_H
#define MYAPP_H
#include <QApplication>
#include <QSystemTrayIcon>
#include <QAction>
#include <QMenu>
class MyApp : public QApplication
{
Q_OBJECT
public:
MyApp(int & argc, char ** argv);
~MyApp();
private:
void createActions();
void createTrayIcon();
signals:
public slots:
void statusTriggered();
void iconActivated(QSystemTrayIcon::ActivationReason);
public:
QSystemTrayIcon *trayIcon;
QMenu *trayIconMenu;
QAction *statusAction;
QAction *quitAction;
};
#endif // MYAPP_H
MyApp.cpp
C++ (Qt)
#include "myapp.h"
#include <QPushButton>
#include <QDateTime>
MyApp::MyApp(int & argc, char ** argv) : QApplication(argc, argv) {
setQuitOnLastWindowClosed(false);
createActions();
createTrayIcon();
QIcon icon(":/images/icon.png");
connect(trayIcon, SIGNAL(activated(QSystemTrayIcon::ActivationReason)),
this, SLOT(iconActivated(QSystemTrayIcon::ActivationReason)));
trayIcon->setIcon(icon);
trayIcon->show();
}
MyApp::~MyApp(){
delete trayIcon;
}
void MyApp::iconActivated(QSystemTrayIcon::ActivationReason reason)
{
QPushButton btn("Lala");
switch (reason) {
case QSystemTrayIcon::Trigger:
btn.show();
break;
default:
break;
}
}
void MyApp::statusTriggered() {
}
void MyApp::createActions() {
statusAction = new QAction("Status", this);
connect(statusAction, SIGNAL(triggered()), this, SLOT(statusTriggered()));
quitAction = new QAction("Quit", this);
connect(quitAction, SIGNAL(triggered()), this, SLOT(quit()));
}
void MyApp::createTrayIcon() {
trayIconMenu = new QMenu;
trayIconMenu->addAction(statusAction);
trayIconMenu->addSeparator();
trayIconMenu->addAction(quitAction);
trayIcon = new QSystemTrayIcon(this);
trayIcon->setContextMenu(trayIconMenu);
}
main.cpp очевидный:
C++ (Qt)
#include <QtGui/QApplication>
#include "myapp.h"
int main(int argc, char *argv[])
{
MyApp a(argc, argv);
return a.exec();
}
Так вот. Тыкаем правой кнопкой на иконке в трее, выбираем Status. Т.к. в слоте у нас пусто - ничего не происходит. Тыкаем ещё раз кнопкой - и фигушки, меню больше не вылезает. Я борюсь с этим, перехватывая левую кнопку мыши и быстро показывая и уничтожая кнопку (бред, но меня спасает), после того как кнопка моргнёт, вылезает менюшка от прошлого правого клика.
Кто может объяснить такое странное поведение и как с ним бороться?
WinXP sp3, Qt 4.6.2 (собирал с -static), на Qt 4.7.0 такое же поведение.