2012-02-05 83 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); 
相关问题