2013-04-15 112 views
1

我正在编写一个应用程序,使用KDE和QML。主窗口将是纯粹的QML,具有非常自定义的外观,所以我根本不需要菜单栏。我要去一个像Dolphin“Control”按钮的东西,但在QML中实现。但是,如果用户具有全局菜单栏(如Unity或KDE全局菜单栏),我想显示一个菜单栏,以便它适合其他应用程序。如何仅在全局菜单栏中显示菜单栏时才提供菜单栏?

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

Dolphin with global menu bar

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

回答

0

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

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

希望有所帮助。

+0

对不起,如果我不够清楚。在我刚刚添加的图片中,我在KDE面板中有一个小部件来提供全局菜单栏。 Dolphin设置为不显示其菜单栏(并且没有全局菜单栏),但它仍然显示在全局菜单栏小部件中。这是我想要的。无论最大化/全屏状态如何,它都应该显示。 – iBelieve

+0

KDE的用户界面现在几乎完全用Qt编写。 OSX使用这样的全局菜单栏,Qt在Mac上运行Qt应用程序时使用它。通常,当你不在QML中时,你只需要创建一个QMainWindow,而Qt只是决定将Menubar放在哪里,如果你正在为Mac或Windows或Linux编译。 – phyatt

1

查看Dolphin的源代码后,这似乎是由KDE(或者可能由Qt)自动处理的。如果菜单栏被隐藏,它将不会显示在窗口框架中,但是如果它被导出到全局菜单栏,它将显示,而不管菜单栏是否隐藏。如果您正在使用KDE和希望规范的方法来隐藏/显示

menuBar()->setHidden(false); 

为了使菜单栏从窗口不断显示,但在一个全球性的菜单栏仍显示,简单地做到这一点菜单栏,你可以使用一个KStandardAction

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

如果修改工具栏,如显示控制按钮,你可能需要做特殊(从海豚取码):

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

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