2013-04-15 47 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)。