1

我正在编写一个使用 KDE 和 QML 的应用程序。主窗口将是纯 QML,具有非常自定义的外观,所以我根本不需要菜单栏。我将有一个类似海豚“控制”按钮的东西,但在 QML 中实现。但是,如果用户有一个全局菜单栏,比如 Unity 或 KDE 全局菜单栏,我想显示一个菜单栏,以便它适合其他应用程序。

我注意到这是 KDE 文件管理器 Dolphin 的工作方式。默认情况下,有一个“控制”按钮,其中包含一组有限的菜单。但是,如果存在全局菜单栏,则将导出常规菜单栏,即使它仍设置为不显示菜单栏。

带有全局菜单栏的 Dolphin

如何将菜单栏设置为仅在全局菜单栏中显示时才显示?可以在纯 Qt 中完成还是必须使用 KDE?如果这是通过不显示菜单栏自动提供的,我该如何隐藏菜单栏?

4

2 回答 2

1

查看 Dolphin 的源代码后,这似乎是由 KDE(或者可能由 Qt)自动处理的。如果菜单栏被隐藏,它不会显示在窗口框架中,但如果它正在导出到全局菜单栏,则无论菜单栏是否隐藏都会显示。

要使菜单栏不再显示在窗口中,但仍显示在全局菜单栏中,只需执行以下操作:

menuBar()->setHidden(false);

如果您使用的是 KDE,并且想要一种标准化的方式来隐藏/显示菜单栏,您可以使用KStandardAction

KStandardAction::showMenubar(this, SLOT(toggleShowMenuBar()),
        actionCollection());

如果你修改工具栏,比如显示一个控制按钮,你可能需要特别做(代码取自 Dolphin):

KToggleAction* showMenuBar = KStandardAction::showMenubar(0, 0, 
        actionCollection());
connect(showMenuBar, SIGNAL(triggered(bool)),                   // Fixes #286822
        this, SLOT(toggleShowMenuBar()), Qt::QueuedConnection);

显然,需要特殊连接,因为插槽会修改工具栏(请参阅KDE 错误 #286822)。

于 2013-04-18T17:17:44.057 回答
0

从 Qt 内部很容易知道您的应用程序是最小化、最大化、刚刚显示还是全屏显示(请参阅 参考资料QWidget::windowState())。正式检测操作系统或其他附近窗口的状态是操作系统特定的。

一种“hacky”的方法是检查桌面的大小(请参阅 参考资料QDesktopWidget)并检查最大化窗口的大小,看看它们在单个方向上是否相差 x 量。如果是,则使用全局菜单栏/任务栏模式,否则进入隐藏菜单栏模式。但是您可能需要定期检查,以防任务栏自动隐藏。

希望有帮助。

于 2013-04-16T03:24:06.937 回答