Russian Qt Forum

Компиляторы и платформы => Mac OS X => Тема начата: Old от Март 20, 2018, 09:51



Название: QSystemTrayIcon и клики мышкой
Отправлено: Old от Март 20, 2018, 09:51
Доброе утро, камрады!

Подскажите пожалуйста маководы, как заставить QSystemTrayIcon по разному реагировать на клики левой и правой кнопкой мышки по своей иконки.


Название: Re: QSystemTrayIcon и клики мышкой
Отправлено: ksk- от Март 20, 2018, 10:06
Есть подозрение, что никак.


Название: Re: QSystemTrayIcon и клики мышкой
Отправлено: kambala от Март 20, 2018, 13:26
Qt::MouseButtons QGuiApplication::mouseButtons() не выдает правильную нажатую кнопку?

вообще можно, но только с помощью всяких рантайм-хаков, судя по исходникам.
Код
Objective-C
// qcocoasystemtrayicon.mm Qt 5.10.1
if (mouseButton == Qt::MidButton)
   emit systray->activated(QPlatformSystemTrayIcon::MiddleClick);
else
   emit systray->activated(QPlatformSystemTrayIcon::Trigger);
если есть возможность править исходники, то задача решается и своими силами несложно :)

какая поддерживается минимальная версия макос и какая версия Qt используется?


Название: Re: QSystemTrayIcon и клики мышкой
Отправлено: Old от Март 20, 2018, 13:38
Qt::MouseButtons QGuiApplication::mouseButtons() не выдает правильную нажатую кнопку?
Спасибо за идею. Можно будет попробовать не задавать меню трея, а при активации смотреть какая кнопка мыши нажата и при необходимости показывать меню руками.

если есть возможность править исходники, то задача решается и своими силами несложно :)
Ох, не хочу я еще и Qt под маком собирать. Этот вариант буду рассматривать в саму последнюю очередь. :)

какая поддерживается минимальная версия макос и какая версия Qt используется?
macOS Sierra ver 1012.6
Qt 5.10


Название: Re: QSystemTrayIcon и клики мышкой
Отправлено: Old от Март 20, 2018, 13:49
Спасибо за идею. Можно будет попробовать не задавать меню трея, а при активации смотреть какая кнопка мыши нажата и при необходимости показывать меню руками.
Не сработало. :(
Всегда возвращает 0 (Qt::NoButton).


Название: Re: QSystemTrayIcon и клики мышкой
Отправлено: Old от Март 20, 2018, 14:08
Подскажите, а я как-то могу фильтровать/перехватывать события от system tray параллельно с кютешным?


Название: Re: QSystemTrayIcon и клики мышкой
Отправлено: ksk- от Март 20, 2018, 15:00
Наверное, более верным решением было бы написать свою обёртку над NSStatusItem, чем пытаться что-то наковырять средствами Qt.


Название: Re: QSystemTrayIcon и клики мышкой
Отправлено: Old от Март 20, 2018, 15:17
Наверное, более верным решением было бы написать свою обёртку над NSStatusItem, чем пытаться что-то наковырять средствами Qt.
Я mac вижу первый раз, также как и obj-c. :)

Если я напишу такую обертку (по аналогии с кютешной), как ее в дальнейшем использовать в плюсовом коде?


Название: Re: QSystemTrayIcon и клики мышкой
Отправлено: ksk- от Март 20, 2018, 15:27
Проблем с подключением нет.

Можно использовать расширение *.mm у файлов с obj-c++ кодом, чтобы их собирал соответствующий компилятор.

Фреймворки Cocoa можно прилинковать так, например (CMake):
Код:
SET(CMAKE_EXE_LINKER_FLAGS "-framework AppKit -w")


Название: Re: QSystemTrayIcon и клики мышкой
Отправлено: kambala от Март 20, 2018, 15:40
какая поддерживается минимальная версия макос и какая версия Qt используется?
macOS Sierra ver 1012.6
действительно, приложение на ОС ниже 10.12.6 не должно запускаться? зачем вы так жестко с юзерами? :)
Подскажите, а я как-то могу фильтровать/перехватывать события от system tray параллельно с кютешным?
теоретически можно через void QCoreApplication::installNativeEventFilter(QAbstractNativeEventFilter *filterObj), но я не пробовал
Наверное, более верным решением было бы написать свою обёртку над NSStatusItem, чем пытаться что-то наковырять средствами Qt.
можно, конечно, но когда впервые в жизни лезешь в нативный код макос... :)

написал небольшой пример по задаче, опирающийся на внутреннее устройство Qt, должен работать на любой версии макос: https://github.com/kambala-decapitator/QtMacSysTrayIconRightClick


Название: Re: QSystemTrayIcon и клики мышкой
Отправлено: Old от Март 20, 2018, 15:48
действительно, приложение на ОС ниже 10.12.6 не должно запускаться? зачем вы так жестко с юзерами? :)
ПО узкоспециализированное. И платформа mac самая не востребованная. Делаю что-бы было. :)

написал небольшой пример по задаче, опирающийся на внутреннее устройство Qt, должен работать на любой версии макос: https://github.com/kambala-decapitator/QtMacSysTrayIconRightClick
Спасибо. Сейчас посмотрю.


Название: Re: QSystemTrayIcon и клики мышкой
Отправлено: kambala от Март 20, 2018, 21:32
Цитировать
теоретически можно через void QCoreApplication::installNativeEventFilter(QAbstractNativeEventFilter *filterObj), но я не пробовал
да, так тоже можно (и никакая рантайм-магия не нужна), так что наверное можно и через обычный фильтр на qApp без залезания в objc :)


Название: Re: QSystemTrayIcon и клики мышкой
Отправлено: Old от Март 20, 2018, 22:48
да, так тоже можно (и никакая рантайм-магия не нужна), так что наверное можно и через обычный фильтр на qApp без залезания в objc :)
kambala, ksk- большое спасибо.