Один щелчок по значку приложения в 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)
Если вы ссылаетесь на это: QT на OS X, как обнаружить нажатие на значок приложения Dock, onClickOnDock не должен быть членом класса.
Вы МОЖЕТЕ поместить его как обычную функцию в файл MyApplicationClass.cpp.
По крайней мере, для Qt 5.9.1 существует хак, когда вы можете реализовать onClickOnDock () без кода, специфичного для платформы. Увидеть https://stackoverflow.com/a/46488514/8695355