【问题标题】:Minimize to tray on MacOSX在 MacOSX 上最小化到托盘
【发布时间】:2017-05-31 13:26:25
【问题描述】:

早上好,在我在 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 上的任务栏中最小化窗口?

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

非常感谢大家

【问题讨论】:

    标签: macos qt minimize trayicon


    【解决方案1】:

    嗯,我不知道 Qt,但我非常了解 Cocoa。就Objective-C API 而言,您的hide() 调用可能相当于-orderOut:。不幸的是,-orderOut: 不适用于最小化的窗口。它在 Dock 中留下一个“幽灵”窗口,可以将其最小化为实际的幽灵窗口。也就是说,它只是窗口的图像,而不是实际的实时窗口。

    拨打-close 确实有效。我不知道 Qt 等价物是什么。不过,您必须小心避免-close 的某些次要后果超出-orderOut: 的后果。例如,某些窗口设置为在关闭时自行释放,您希望禁用它。此外,窗口委托的-windowWillClose: 方法将被调用,并且对于非真正关闭的调用它不应该做任何事情。

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

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

    最后,我会问你是否真的想实现这个功能。这会让用户感到困惑。当您最小化一个窗口时,它会为 Dock 的最小化设置动画。这让用户对在哪里可以找到窗口有一个强烈的印象。如果随后没有找到窗口所在的位置,则用户将不会知道去别处寻找。同样,Exposé/Mission Control 向用户显示除普通窗口外的应用程序的最小化窗口。您所谓的最小化到托盘的窗口不会显示在那里,因为它们不再真正最小化。

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

    【讨论】:

    • 嗯感谢您的评论。奇怪的是,该应用程序还有一个“靠近托盘”选项,而且效果很好。但我使用相同的 Qt 函数“hide()”。我将调查你所说的 close 和 orderOut 之间的区别。谢谢。
    • 好吧,如果hide()-orderOut: 的包装,那么这对于“靠近托盘”就可以了。正如我所说,-close-orderOut: 非常相似,除了一些极端情况。据推测,在“靠近托盘”的情况下,窗口不会最小化,因此其中一个差异是不相关的。
    猜你喜欢
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-15
    相关资源
    最近更新 更多