Иногда средств 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 для отлова нативных маковских событий
Страничка этого маленького проекта тут, там же ссылка на наш репозиторий
_________
Текст подготовлен в ХабраРедакторе
Адаптируя 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
Страничка этого маленького проекта тут, там же ссылка на наш репозиторий
_________
Текст подготовлен в ХабраРедакторе