1

我的应用程序有非矩形弹出小部件。

他们的班级定义了以下内容以实现这种透明度:

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

我也使用:

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

问题是在 Windows 7 上,在我的窗口的底部和右侧绘制了一个自动“阴影”。这是非常不希望的。

所以,我尝试使用 Qt::Tool 而不是 Qt::Popup

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

这在视觉上有效。没有阴影,但现在在我的小部件窗口外单击鼠标不会像使用 Qt::Popup 那样自动关闭/隐藏它。

所以,我需要以下两种解决方案之一:

  1. 一种让 Qt::Popup摆脱自动窗口阴影装饰的方法
  2. 一种让 Qt::Tool 窗口在其外部发生鼠标单击的方法。

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

欢迎任何建议。

4

4 回答 4

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();
于 2013-08-14T12:45:14.070 回答
1

最后,在意识到没有多少“SetFocusPolicy”调用将允许我接收 Qt::Tool 窗口的这些事件之后,我求助于其他方法来解决我的问题:

  1. 我保留了 Qt:tool,因为 Qt::Popup 导致了不希望的阴影效果,玷污了我的主人并条框。在 Qt 中无法删除这种样式,我不想弄乱平台特定的条件代码。
  2. 我在我的 Qt::tool 窗口中安装了一个事件过滤器,我开始接收事件,这些事件帮助我了解何时单击了我的应用程序的其他部分,或者应用程序本身是否失去了对另一个应用程序的关注。这就是我所需要的,功能方面的。当用户单击应用程序主窗口的非客户区域时,我也可以获得一个事件,例如窗口标题,以便在开始拖动时关闭它等。
于 2013-05-12T23:21:09.607 回答
1

您可以手动观察焦点何时从Qt::Tool窗口发生变化。因此,基本上您要注意焦点何时进入进程的另一个窗口或应用程序何时失去焦点。

如何检测我的应用程序在 Qt 中失去焦点?

希望有帮助。

于 2013-05-07T00:12:17.400 回答
0

我设置了我的 QListView

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

安装 eventfilter 并使用 MousePressEvent 隐藏 qlistview 小部件。

列表中的 MousePressEvent 永远不会过滤它们产生我没有调试的其他事件。

因此,如果您想设计自动完成器,这将是完美的。在 Qt5.3.1 中测试。

于 2014-07-14T14:36:59.187 回答