最小化到停靠后恢复Qt应用程序,使用OS X上的扩展坞快捷方式

Restoring Qt app after minimized to dock, using dock shortcut on OS X

本文关键字:OS 扩展 快捷方式 使用 停靠 恢复 应用程序 Qt 最小化      更新时间:2023-10-16

单击程序坞中的应用程序图标将启动该应用程序,或者,如果应用程序已打开,则会将您切换到该应用程序并打开该应用程序中所有打开的窗口。

在我的Qt应用程序中,我没有看到这种行为。我有一个停靠快捷方式,我最小化了停靠上的应用程序,如果我单击最小化的实例,应用程序将恢复。

如果我单击Dock(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();
};

我的应用程序类.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(

如果你指的是这个:OS X上的QT,如何检测点击应用程序Dock Icon,onClickOnDock不应该是该类的成员。

您可以将其作为普通函数放在 MyApplicationClass.cpp 文件中。

至少

在Qt 5.9.1中有一个黑客,当你可以在没有平台特定代码的情况下实现onClickOnDock((。见 https://stackoverflow.com/a/46488514/8695355