2012-02-05 56 views
5

我想通過繼承QDialog來實現通知窗口。它應該在其他窗口之上,但我不希望它出於顯而易見的原因從其他窗口竊取焦點。我也擔心它會干擾視頻和遊戲等全屏應用。實現不從全屏應用程序竊取焦點的通知對話框?

我該如何去實施?有沒有我可能想要了解的常見編程和用戶體驗實踐?所有的

回答

0

首先,你需要創建一個non modal dialog

一個無模式對話框的是,在同一個應用程序獨立於其他 窗口的運行對話框。在 中查找和替換對話框文字處理器通常是無模式的,以允許用戶與應用程序的主窗口和對話框進行交互。

爲了實現您需要調用show函數而不是exec之一。

+0

糾正我,如果我錯了,但這隻會導致窗口獨立於其父母操作。當用戶ALT + TAB時,它仍然不會保持在最前面。 – Pieter 2012-02-05 14:45:02

+0

QDialog是一個頂級窗口。你可以使用'raise'函數,如果你想確保它會在父窗口部件的堆棧之上。使用'show',對話框將可見,並且您將能夠與應用程序的其他窗口進行交互。如果您希望在整個應用程序中使對話框可見,那麼您可以將主窗口設置爲其父窗口。我不確定ALT + TAB發生了什麼 – pnezis 2012-02-05 15:09:13

+0

當用戶按下ALT + TAB(或將焦點置於全屏窗口)時,QDialog不再位於其他窗口之上。對於[MSN Messenger-like](http://www.donkhuth.com/wp-content/uploads/2007/01/saosang.jpg)通知,這不是我想要實現的通知。 – Pieter 2012-02-05 15:18:27

1

還沒有嘗試過,但它看起來像

my_dialog->setWindowFlags(Qt::CustomizeWindowFlags | ... | Qt::WindowStaysOnTopHint); 

應該工作,結合使其無模式。

+0

我已經從您的帖子中刪除了正確的答案標記,因爲有時彈出式搶斷將從我當前的窗口重點進行。這不是期望的行爲。我怎樣才能避免這種情況? – Pieter 2012-04-20 09:34:10

0

這似乎是一個很老的話題。但是,我沒有看到任何人發佈了正確的答案,所以我將我的解決方案發布到我最近面臨的同樣問題。首先,如果你希望你的對話不要從其他對話框或輸入字段竊取焦點,你應該設置以下屬性:Qt :: WA_ShowWithoutActivating。使用這個屬性,窗口(對話框也是一個窗口)將被顯示而不被激活。然後,可能您會希望根據需要定製對話框,並且您希望將該對話框顯示在最前面。因此,可以設置以下Window標誌以便以跨平臺方式實現這樣的結果:Qt :: FramelessWindowHint | Qt :: NoDropShadowWindowHint | Qt :: X11BypassWindowManagerHint | Qt :: Tool | Qt :: WindowStaysOnTopHint | Qt :: WindowTransparentForInput | Qt :: WindowDoesNotAcceptFocus

下面的代碼是的實例來實現一個對話框,是無模式之一,並且不從任何人偷焦點(假設對話框是一個變量指向了QDialog的有效實例):

dialog->setAttribute(Qt::WA_ShowWithoutActivating, true); 
dialog->setWindowFlags(dialog.windowFlags() | Qt::FramelessWindowHint | Qt::NoDropShadowWindowHint | Qt::X11BypassWindowManagerHint | Qt::Tool | Qt::WindowStaysOnTopHint | Qt::WindowTransparentForInput | Qt::WindowDoesNotAcceptFocus);