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

Posted

技术标签:

【中文标题】在最小化到停靠后恢复 Qt 应用程序,使用 OS X 上的停靠快捷方式【英文标题】:Restoring Qt app after minimized to dock, using dock shortcut on OS X 【发布时间】:2014-12-16 18:30:36 【问题描述】:

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

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

如果我单击 Dock 中的应用程序图标(停靠快捷方式),则没有任何反应。

(我可以右键单击,然后“显示所有窗口”——但这与所有其他应用程序的行为不同)

我试图从这个答案中放置代码:https://***.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 on OS X, how to detect clicking the app Dock Icon,则 onClickOnDock 不应是该类的成员。

你可以把它作为一个普通函数放在 MyApplicationClass.cpp 文件中。

【讨论】:

【参考方案2】:

至少对于 Qt 5.9.1 有一个 hack,当您完全可以在没有平台特定代码的情况下实现 onClickOnDock() 时。见https://***.com/a/46488514/8695355

【讨论】:

以上是关于在最小化到停靠后恢复 Qt 应用程序,使用 OS X 上的停靠快捷方式的主要内容,如果未能解决你的问题,请参考以下文章

windows下QT程序如何最小化到任务栏

qt窗口化怎么恢复全屏

Qt - 即使 QMainWindow 太小也允许停靠

Qt - pyside - saveGeometry() saveState()

在 OS X 的停靠栏上下文菜单中显示图标?

删除 Mac OS X 中 shell 可执行文件的停靠图标?