c++ - 在QT应用程序中制作一个透明孔

标签 c++ qt qt5 x11 qapplication

我遇到了一个问题,我将 2 个 Qt 应用程序放在彼此之上。最上面的 Qt 应用程序需要一个透明的孔来显示它后面的 Qt 应用程序。有什么办法吗?或者 Qt 库中某处是否有可以帮助我的示例?

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

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

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

编辑:由于我的问题不够清楚而被删除,这里有 3 个我正在尝试实现的示例。

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

Example 1

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

Example 2

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

Example 3

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

我的跟进: Qt 库或任何其他实现此功能的地方是否有任何示例?

最佳答案

最终,在大量使用 Qt 之后,我能够做我想做的事。

我的解决方案基于 clock来自 Qt 的示例。我已将 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 页面顶部以显示透明度):

Transparent square

此解决方案的优点在于它适用于 Linux 和 Windows。因为我尝试过的大多数东西都可以在 Windows 上运行,但不能在 Linux 上运行。

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

关于c++ - 在QT应用程序中制作一个透明孔,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63028741/

相关文章:

C++:如何创建两个相互依赖的共享库?

css - 同时在桌面 C++ 应用程序和 wordpress 中重新使用 QT CSS

c++ - 从文本文件中读取行和列 QT GUI C++

c++ - 即使 QTabletEvent 被接受,QWidget 的 mousePressEvent 也会被调用

c++ - 投给一个 child

c++ - 头文件与源文件中的外部函数

c++ - Qt 样式 - 双色边框?

c++ - QML 绑定(bind)整数属性 - C++ 中的更改未发送到 QML

c++ - C++ 中的排序字符串不能正确比较?

c++ - 构建 Qt 程序时遇到问题