Как стать автором
Обновить

Как поймать клик на иконке в MacX dock из Qt приложения

Иногда средств Qt не хватает, что бы корректно обрабатывать нативные события в разных ОС. В этой статье я хочу рассказать, об одном из таких специфических событий, а именно клик, на иконке в маковском dockе.


Адаптируя MDC для Mac OS X столкнулся со следующей проблемой. По уже сложившимся представлениям о прекрасном, закрытие всех окон приложения IM не должно приводить к закрытию самого приложения. Пользователю, для того что бы снова увидеть окно контакт листа, как правило, нужно просто кликнуть на иконку в tray. Однако, с маком все обстоит несколько хитрее, поскольку для пользователя более естественным является работа dockом. Таким образом, закрыв все окна приложения пользователь ожидает, что кликнув на иконку в dockе, он снова будет лицезреть главное окно приложения. Однако этого не происходит.

Напрашивается простой вывод, необходимо отлавливать события клика на иконку в docke и показывать главное окно приложения. Однако чтение документации подобного eventa не обнаружило. Вопрос в support nokia тоже не порадовал, оказалось что подобного eventa нет поскольку он противоречит концепции Qt, относительно платформозависимых событий.

Среди стандартных Qt event ов есть `QEvent::ApplicationActivate`, однако он удовлетворяет наши запросам лишь отчасти. Потому как, если закрыть все окна нашего приложения, а потом сразу кликнуть на иконку в dock, приложение все еще будет являться активным, и событие не случится. А eventа ApplicationReActive в Qt нет.

Выход был найден следующий, использовать Carbon для отлова нативных маковских событий

#ifndef MACAPPLICATION_H
#define MACAPPLICATION_H

// Qt4 Headers
#include <QApplication>

// Carbon Headers
#ifdef Q_WS_MAC
  
#include <Carbon/Carbon.h>
#endif

class CMacApplication : public QApplication
{
  Q_OBJECT
public:
  CMacApplication (int& m_argc, char **m_argv);

  /**
   * Метнуть сигнал о переоткрытии приложения (в том числе dock click)
   */
   void emitReopenApplication ();

#ifdef Q_WS_MAC
  AEEventHandlerUPP m_appleEventProcessorUPP;
#endif

signals:

  void reopenApplication();

};
#endif // MACAPPLICATION_H



Страничка этого маленького проекта тут, там же ссылка на наш репозиторий
_________
Текст подготовлен в ХабраРедакторе
Теги:
Хабы:
Данная статья не подлежит комментированию, поскольку её автор ещё не является полноправным участником сообщества. Вы сможете связаться с автором только после того, как он получит приглашение от кого-либо из участников сообщества. До этого момента его username будет скрыт псевдонимом.