2013-05-06 403 views
1

我的应用程序有非矩形的弹出窗口小部件。检测QWidget外部点击

其类定义了以下以实现透明度:

setAttribute(Qt::WA_NoSystemBackground, true); 
setAttribute(Qt::WA_TranslucentBackground, true); 

我也使用:

this->setWindowFlags(Qt::Popup| Qt::FramelessWindowHint); 

的问题是,在Windows 7,一种自动的“影子”被上所绘制的我的窗户的底部和右侧。这是非常不可取的。

所以,我尝试使用Qt ::工具,而不是Qt的::弹出

this->setWindowFlags(Qt::Tool | Qt::FramelessWindowHint); 

此作品在视觉上。没有阴影,但现在我的窗口小部件窗口外面点击鼠标不会自动关闭/隐藏它,因为它会用Qt :: Popup完成。

所以,我需要这两个解决方案之一:

  1. 有Qt的::弹出一种方法摆脱Windows自动阴影装饰
  2. 办法让Qt的::工具窗口在其外部发生鼠标点击。

一注:我的应用程序是为Windows XP及以上构建的。我不能仅使用Vista/Win7运行时DLL,也不能使用“Windows XP”和“Vista和更高版本”单独的版本。

任何建议将受到欢迎。

回答

1

意识到,没有“SetFocusPolicy”通话量将允许我收到一个Qt :: Tool窗口的事件之后。最后,我已经使出别的东西来解决我的问题:

  1. 我不停作为Qt :: Popup的Qt:工具导致了不希望的阴影效果,使我的所有者绘制框架变暗。去掉这种风格不能在Qt中完成,我不想混淆特定于平台的条件代码。
  2. 我使用Qt :: tool窗口安装了一个事件过滤器,并开始接收事件,这些事件帮助我了解何时单击了应用程序的其他部分,或者应用程序本身是否失去了焦点到另一个应用程序。这就是我需要的,功能明智的。当用户点击应用程序主窗口的非客户区域时,例如窗口标题,我也可以得到一个事件,以便在拖动开始时关闭它。
+0

Qt :: WindowType :: NoDropShadowWindowHint可以擦除阴影效果 – Enzojz 2016-12-19 09:44:55

1

您可以手动观察焦点是否从您的Qt::Tool窗口改变。所以基本上你会注意什么时候焦点会放到你的流程的另一个窗口上,或者当你的应用程序失去焦点时。

How to detect that my application lost focus in Qt?

希望有所帮助。

+0

Qt:如果我点击其父部件的框架,工具不会收到focusOutEvent。只有Qt :: Popup可以做到这一点。 – JasonGenX 2013-05-08 15:39:37

+1

你必须为它设置焦点策略来接收焦点事件:'this-> setFocusPolicy(Qt :: ClickFocus);' – phyatt 2013-05-08 16:53:35

1

我对Windows 7的解决方案:

QDialog *d = new QDialog; 
d->setStyleSheet("background:transparent;"); 
d->setAttribute(Qt::WA_DeleteOnClose, true); 
d->setAttribute(Qt::WA_TranslucentBackground, true); 
#ifdef Q_OS_WIN 
d->createWinId(); 
#endif 
d->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint); 
d->show(); 
0

设置我而QListView

d->setWindowFlags(Qt::Popup | Qt::FramelessWindowHint); 

安装eventfilter和使用MousePressEvent隐藏而QListView部件。

列表上的MousePressEvent从来没有过滤它们产生的其他事件,我没有调试。

所以,如果你想设计自动完成这将是完美的。在Qt5.3.1中测试。