早上好,在我的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中的行为吗?
非常感谢大家
答案 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还向用户显示应用程序的最小化窗口。你认为最小化到托盘的窗口不会显示在那里,因为它们不再真正被最小化了。
也许只是禁用最小化。让用户完成后只需关闭窗口,然后从状态项菜单中重新打开它。