Восстановление приложения Qt после сворачивания в док-станцию ​​с использованием сочетания клавиш в OS X

Один щелчок по значку приложения в Dock запускает это приложение или, если приложение уже открыто, переключает вас на это приложение и отображает все открытые окна в этом приложении.

В моем приложении Qt я не вижу такого поведения. У меня есть ярлык док-станции, я минимизирую приложение на док-станции, и если я щелкаю свернутый экземпляр, приложение восстанавливается.

Если я щелкну значок приложения в Dock (ярлык док-станции), ничего не произойдет.

(Я могу щелкнуть правой кнопкой мыши и «Показать все окна» — но это не похоже на поведение всех других приложений)

Я попытался разместить код из этого ответа: https://stackoverflow.com/a/15363738/1217150

размещение qDebug заявления,

if(test) qDebug("registered");

в конструкторе и

void MyApplictionClass::onClickOnDock()
{
qDebug("dock clicked");
}

При запуске я получаю оба сообщения … но после сворачивания или в любое время после запуска, нет реакции на нажатие ярлыка на док-станцию ​​или двойной щелчок.

Полная вставка кода:

MyApplicationClass.h:

#include <objc/objc.h>
#include <objc/message.h>
class MyApplicationClass: public QApplication
{
....
bool dockClickHandler(id self, SEL _cmd, ...);
void onClickOnDock();
};

MyApplicationClass.cpp:

MyApplicationClass::MyApplicationClass()
{
....
objc_object* cls = objc_getClass("NSApplication");
SEL sharedApplication = sel_registerName("sharedApplication");
objc_object* appInst = objc_msgSend(cls, sharedApplication);
if(appInst != NULL)
{
objc_object* delegate = objc_msgSend(appInst, sel_registerName("delegate"));
objc_object* delClass = objc_msgSend(delegate, sel_registerName("class"));
const char* tst = class_getName(delClass->isa);
bool test = class_addMethod((objc_class*)delClass,
sel_registerName("applicationShouldHandleReopen::hasVisibleWindows:"),
(IMP)dockClickHandler(appInst, sharedApplication), "B@:");
if(!test) qDebug("not registered");
else qDebug("registered");
}
.....
}

bool MyApplicationClass::dockClickHandler(id self, SEL _cmd, ...)
{
Q_UNUSED(self)
Q_UNUSED(_cmd)
onClickOnDock();
return true;
}

void MyApplicationClass::onClickOnDock()
{
qDebug("dock clicked");
}

Возможно, я сделал что-то не так? Есть несколько вещей, которые я не понимаю … dockClickHandler не часть класса … я просто не знаю, где у них это есть … И я должен был дать этому аргументы, когда я зарегистрировал его, иначе он отказался строить. Тем не менее, похоже, что … что-то … просто не правильно. В этом коде я не вижу, как приложение будет реагировать на нажатие на док-станцию.

Это правильный подход? Или как я могу восстановить приложение, если щелкнуть его ярлык на панели?

(OSX 10.6-10.9, Qt 4.8)

1

Решение

Если вы ссылаетесь на это: QT на OS X, как обнаружить нажатие на значок приложения Dock, onClickOnDock не должен быть членом класса.

Вы МОЖЕТЕ поместить его как обычную функцию в файл MyApplicationClass.cpp.

0

Другие решения

По крайней мере, для Qt 5.9.1 существует хак, когда вы можете реализовать onClickOnDock () без кода, специфичного для платформы. Увидеть https://stackoverflow.com/a/46488514/8695355

0

По вопросам рекламы [email protected]