最小化到MacOSX上的托盘

时间:2017-05-31 13:26:26

标签: macos qt minimize trayicon

早上好,在我的MacOSX应用程序中,我想给用户选择“最小化到托盘”。我使用Qt5并重写了

changeEvent(QEvent *event)

功能。在那里我做了类似

的事情
switch( event->type() )
{
case QEvent::WindowStateChange:
    {
        if ( this->windowState() & Qt::WindowMinimized ) {
            if( *option minimize to tray enable* ) {
                event->ignore();
                QTimer::singleShot(0, this, SLOT(hide()));
            }
        }
        break;
    }
default:
    break;
}

嗯,它可以在Linux和Windows上运行,但问题是在MacOSX中这段代码无法正常运行并产生错误。实际上,窗口仍然在任务栏中最小化(除了扩展坞),此外,如果窗口从任务栏而不是托盘图标调整大小,则GUI被阻止并且不会改变。 GUI仍然可以发送信号,但不能改变。我必须从托盘图标重新显示窗口以取消阻止GUI。

然后问题:如何避免在MacOSX上最小化TaskBar中的Window?

另一个相关问题:我已经阅读了一些论坛,其中一些用户在MacOSX中谈到“标准行为”,例如,当单击“x”按钮时不关闭应用程序,或者不使用托盘图标ecc。 ecc ....有人可以发布官方链接应用程序在MacOSX中的行为吗?

非常感谢大家

1 个答案:

答案 0 :(得分:1)

好吧,我不知道Qt,但我很了解Cocoa。就Objective-C API而言,您的hide()调用可能与-orderOut:相当。遗憾的是,-orderOut:无法正常使用最小化窗口。它在Dock中留下了一个“鬼”窗口,可以将其最小化为实际的鬼窗口。也就是说,它只是一个窗口的图像,它不是实际的实时窗口。

调用-close确实有效。我不知道Qt的等价物是什么。但是,您必须小心避免-close超出-orderOut:的某些次要后果。例如,某些窗口设置为在关闭时释放自己,您要禁用它们。此外,将调用窗口委托的-windowWillClose:方法,它不会对非真正关闭的调用执行任何操作。

不要担心“关闭”比“隐藏”或“排序”更严重或更永久。除了上面提到的额外后果之外,它实际上是一回事。例如,仍然可以重新显示已关闭的窗口等。

问题是,Qt能否为您提供灵活性。或者,这可以被视为Qt中的一个错误,其hide()实现在最小化窗口上使用-orderOut:而不是-close

最后,我会问你是否真的想要实现这个功能。这会让用户感到困惑。最小化窗口时,它会将最小化设置为Dock。这给用户留下了在哪里找到窗口的强烈印象。如果随后找不到窗口,则用户不会知道在其他地方寻找。同样,除普通窗口外,Exposé/ Mission Control还向用户显示应用程序的最小化窗口。你认为最小化到托盘的窗口不会显示在那里,因为它们不再真正被最小化了。

也许只是禁用最小化。让用户完成后只需关闭窗口,然后从状态项菜单中重新打开它。