在QT应用程序中创建一个透明的洞

3
我有一个问题,我有两个Qt应用程序重叠在一起。顶部的Qt应用程序需要一个透明孔来显示其后面的Qt应用程序。有什么办法可以实现这个功能吗?或者在Qt库中是否有任何例子可以帮助我? 进一步说明: 如果我在Windows机器上运行Qt应用程序,我想通过透明的孔看到我的桌面背景。
我找到了windowOpacity属性。不幸的是,该属性会改变整个应用程序的不透明度,而不仅仅是应用程序的一部分。 为什么您需要两个Qt应用程序?只需在同一应用程序中绘制它们即可? 由于安全原因,此项目不可能这样做,应用程序必须是单独的。要将两个应用程序分开,它们之间只有有限的通信,并且不能使用相同的QT应用程序。
编辑:由于我的问题被删除,因为不够清楚,这里有3个我试图实现的示例。 示例1: 在这里,您可以看到我希望如何显示应用程序1。 2个正方形,一个大正方形(蓝色),它不透明,第二个正方形(白色)在第一个正方形内部,它是透明的(在图片中很难显示透明度)。 示例1 示例2: 在这里,您可以看到我希望如何显示两个应用程序。在透明正方形后面显示第二个应用程序。当它们对齐时,没有太多可见的东西,它只是看起来像两个应用程序相互叠加。 示例2 示例3: 在这里,您可以看到第二个应用程序未正确对齐时应用程序应该如何交互。第二个应用程序只能通过第一个应用程序的透明部分看到。 示例3 重复一遍我的原始问题: 是否可能创建具有透明孔的Qt应用程序? 我的后续问题是: 是否有任何在Qt库或其他任何地方实现这种功能的示例?

2
你见过QWidget::setMask吗?它是用于处理图像的,但或许你可以用它来在一个图像里“绘制”一个洞。然而我不知道它在其他控件存在的窗口中会有怎样的表现。 - ymoreau
谢谢你的提示,我会去看看! - Red-ER
如果你想在Linux上运行它,我建议使用Wayland,并将顶部应用程序制作成Wayland合成器,然后在其中运行第二个应用程序。不过,也许你可以在这个旧话题中找到一些提示:https://dev59.com/IlsX5IYBdhLWcg3whv7Q - André
另外,如果您能够获取应用程序2的顶层窗口ID,则为什么不使用QWidget::createWindowContainer将其嵌入到应用程序1中呢? - G.M.
1个回答

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 页面的顶部显示透明度):

Transparent square

这个解决方案的好处是它适用于Linux和Windows。因为我尝试过的大多数解决方案在Windows上运行良好,但在Linux上却不行。感谢@ymoreau指导我走向正确的方向!

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接