如果菜单栏显示在全局菜单栏中,如何提供?

时间:2013-04-15 14:45:04

标签: qt kde

我正在编写一个使用KDE和QML的应用程序。主窗口将是纯QML,具有非常自定义的外观,所以我根本不需要菜单栏。我打算使用Dolphin“Control”按钮,但是用QML实现。但是,如果用户有一个全局菜单栏,如Unity或KDE全局菜单栏,我想显示一个菜单栏,因此它适合其他应用程序。

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

Dolphin with global menu bar

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

2 个答案:

答案 0 :(得分: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 bug #286822)。

答案 1 :(得分:0)

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

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

希望有所帮助。