【问题标题】:Make a transparent hole in a QT application在 QT 应用程序中打一个透明的洞
【发布时间】:2020-11-11 16:09:47
【问题描述】:

我遇到了一个问题,我有 2 个 Qt 应用程序在彼此之上。顶部的 Qt 应用程序需要一个透明的洞来显示它背后的 Qt 应用程序。有没有办法做到这一点?或者 Qt 库中是否有可以帮助我的示例?

澄清一下,如果我要在 Windows 机器上运行 Qt 应用程序,我希望通过透明孔看到我的桌面背景。

我确实找到了 windowOpacity 属性。不幸的是,这个属性会改变整个应用程序的不透明度,而不仅仅是应用程序的一部分。

您为什么需要 2 个 Qt 应用程序?只需在同一个应用程序中绘制它们? 由于安全原因,应用程序需要分开,这对这个项目来说是不可能的。将两个应用程序分开,两者之间只能进行有限的通信,不能使用同一个 QT 应用程序。

编辑:由于我的问题不够清楚而被删除,这里有 3 个示例来说明我想要实现的目标。

示例 1:在这里您可以看到我希望如何显示应用程序 1。 2个正方形,1个不透明的大正方形(蓝色的)和第一个透明的正方形内的第二个正方形(白色的)(很难在图片中显示透明度)。

示例 2:在这里您可以看到我希望如何显示这两个应用程序。在透明方块后面显示了第二个应用程序。当它们完美对齐时,没什么可看的,它看起来就像两个应用程序相互绘制。

示例 3:您可以在此处看到当第二个应用程序未以正确方式对齐时应用程序应如何交互。第二个应用程序只能通过第一个应用程序的透明部分看到。

再次重复我最初的问题: 是否可以创建带有透视孔的 Qt 应用程序?

我的后续行动: Qt 库中是否有任何示例或任何其他实现此功能的地方?

【问题讨论】:

  • 你见过QWidget::setMask吗?它旨在与图像一起使用,但也许您可以解决它以在图像中“绘制”您的洞。不过,我不知道它在带有其他小部件的窗口内的行为方式。
  • 谢谢你的提示,我去看看!
  • 如果要在 linux 上运行,我建议使用 Wayland 并将您的顶级应用程序设为 Wayland 合成器,然后在其中运行您的第二个应用程序。但是,也许您可​​以在这个较旧的主题中找到一些提示:stackoverflow.com/questions/33699258/…
  • 另外,如果您可以获取应用程序 2 的顶级窗口的 id,那么什么不使用 QWidget::createWindowContainer 将其嵌入应用程序 1 中?

标签: c++ qt qt5 x11 qapplication


【解决方案1】:

在玩了很多 Qt 之后,我终于能够做我想做的事情了。

我的解决方案基于 Qt 中的 clock 示例。我已将 resizeEvent 更改为以下内容:

void Widget::resizeEvent(QResizeEvent * /* event */)
{
    QRegion outsideMask(QRect(0, 0, 200, 200));
    QRegion insideMask(QRect(50, 50, 100, 100));
    QRegion mask = outsideMask.subtracted(insideMask);

    setMask(mask);
}

如果您没有使用时钟示例,请务必不要忘记将背景设置为半透明: setAttribute(Qt::WA_TranslucentBackground);

在那之后我改变了时钟,因为我只需要一个带孔的正方形。

最终的解决方案如下(在google页面上方显示透明度):

这个解决方案的好处是它可以在 Linux 和 Windows 上运行。因为我尝试过的大多数东西都可以在 Windows 上运行,但不能在 Linux 上运行。

感谢@ymoreau 引导我走向正确的方向!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多