单击Dock中的应用程序图标即可启动该应用程序,或者,如果应用程序已打开,则会切换到该应用程序,并将该应用程序中的所有打开的窗口都提前。
在我的Qt应用中,我没有看到这种行为。我有一个停靠快捷方式,我最小化了停靠站上的应用程序,如果我单击最小化的实例,应用程序将恢复。
如果我单击Dock(停靠栏快捷方式)中的应用程序图标,则不会发生任何事情。
(我可以右击,“显示所有Windows” - 但这与所有其他应用的行为不相似)
我尝试放置此答案的代码: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
不属于班级...我只是不知道他们在哪里......而且我不得不给它参数当我注册它,否则它拒绝建立。它仍然似乎......某些事情......不是正确的事情。在该代码中,我看不到应用程序对单击Dock的反应。
这是正确的做法吗?或者如何在单击其停靠快捷方式时让我的应用程序恢复?
(OSX 10.6-10.9,Qt 4.8)
答案 0 :(得分:0)
如果你引用这个:QT on OS X, how to detect clicking the app Dock Icon,onClickOnDock不应该是该类的成员。
您可以将其作为MyApplicationClass.cpp文件中的普通函数。
答案 1 :(得分:0)
至少在Qt 5.9.1中存在一个hack,当你可以实现onClickOnDock()时根本没有特定于平台的代码。见https://stackoverflow.com/a/46488514/8695355