C++ Qt非矩形窗口

C++ Qt非矩形窗口,c++,qt,qml,C++,Qt,Qml,我试图用Qt创建一个非矩形窗口 像这样: ______________________ | | ______| | / | / | | | |

我试图用Qt创建一个非矩形窗口

像这样:

           ______________________
          |                      |
    ______|                      |
  /                              |
 /                               |
|                                |
|                                |
 \                               |
  \_______                       |
          |                      |
          |                      |
          |                      |
          |______________________|
在透明部分实际被打开的情况下,单击下面的非Qt窗口

我发现完成这项工作的唯一方法是:
window->setMask(复杂区域)

<>但是这看起来很难,特别是因为我现在需要知道C++和QML中窗口部件的大小。
理想情况下,我想告诉Qt不要渲染完全透明的东西。

您可以创建一个主小部件,然后使用qpainter绘制设计。在所有其他小部件都位于主小部件内部之后。最后,为主窗口小部件添加透明性,就得到了所需的内容

您可以创建一个主窗口小部件,然后使用QPaint绘制设计。在所有其他小部件都位于主小部件内部之后。最后,为主窗口小部件添加透明性,就得到了所需的内容

如果您主要关心的是要从QML设置掩码,则可以创建一个
QObject
,该对象可从QML访问到
setMask
方法和
QWindow
mask

我已决定从QML中创建此对象。设计可能会有所改进,但它会起作用,并将勾勒出想法

exposemask.h

#ifndef EXPOSEMASK_H
#define EXPOSEMASK_H

#include <QObject>
#include <QRegion>
#include <QWindow>

class ExposeMask : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QRegion mask READ mask WRITE setMask)

public:
    ExposeMask(QObject* parent = nullptr);

    Q_INVOKABLE void setWindow(QWindow* win);
    // Little helper to get a region from a image in QML.
    Q_INVOKABLE QRegion regionFromImage(QString path);

    QRegion mask() const;

    void setMask(const QRegion &region);

private:
    QWindow* m_window;

};

#endif // EXPOSEMASK_H
main.qml中

ExposeMask {
    // I need to do it "onCompleted" for I need to set the window first...
    // You can change this by having the region as a member, exposing the window as property e.t.c
    Component.onCompleted: {
        setWindow(appwindow)
        mask = regionFromImage("mask.png")
    }
}
如果有多个具有正确形状的窗口,则处理形状可能会更容易。因此,在你的绘画中,我会使用两个窗口,其中一个是矩形的,只需要遮住突起。因此,它们尺寸的个别变化更容易计算


此外,如果计算变得复杂,请考虑在C++中使用适当的帮助函数,以便在C++< /P> > P>中,如果您的主要关注点是,希望从QML设置掩码,您可以创建一个

QObject
,该对象可以从QML到隧道访问
setMask
QWindow
mask

我已决定从QML中创建此对象。设计可能会有所改进,但它会起作用,并将勾勒出想法

exposemask.h

#ifndef EXPOSEMASK_H
#define EXPOSEMASK_H

#include <QObject>
#include <QRegion>
#include <QWindow>

class ExposeMask : public QObject
{
    Q_OBJECT
    Q_PROPERTY(QRegion mask READ mask WRITE setMask)

public:
    ExposeMask(QObject* parent = nullptr);

    Q_INVOKABLE void setWindow(QWindow* win);
    // Little helper to get a region from a image in QML.
    Q_INVOKABLE QRegion regionFromImage(QString path);

    QRegion mask() const;

    void setMask(const QRegion &region);

private:
    QWindow* m_window;

};

#endif // EXPOSEMASK_H
main.qml中

ExposeMask {
    // I need to do it "onCompleted" for I need to set the window first...
    // You can change this by having the region as a member, exposing the window as property e.t.c
    Component.onCompleted: {
        setWindow(appwindow)
        mask = regionFromImage("mask.png")
    }
}
如果有多个具有正确形状的窗口,则处理形状可能会更容易。因此,在你的绘画中,我会使用两个窗口,其中一个是矩形的,只需要遮住突起。因此,它们尺寸的个别变化更容易计算


此外,如果计算复杂,请考虑在C++中使用适当的帮助函数,在C++< /P> < P>中,只需将<代码>颜色< /代码> > <代码>窗口>代码> >代码>透明/>代码>设置>代码:qt.FrAMELLISTHOWOWHONTHT > MaOS:


只需将
窗口的
颜色设置为
透明
并设置
标志:Qt.FramelessWindowHint
即可在macOS上使用:



< P> < /P>这是不是当你不使用WIDGET而是QtQuick时?你可以结合QML和C++,我没有用QtQuy测试。但是你在C++中创建了一个主QWIDGET,你把QML放进去。你能给我指出你的意思吗?我对Qt非常陌生。您可以使用一个基于QtWidgets的应用程序来加载qml,而不是使用
main.cpp
中的常规例程。但这就是我会发现的Hacky这会比GrecKo的解决方案更好吗,也就是说,窗口对点击也是透明的?你能详细说明他是如何从QML内部访问这个区域的吗?当你不使用WIDGET,而QtQuick时,这是可行的吗?你可以结合QML和C++,我没有用QtQuy进行测试。但是你在C++中创建了一个主QWIDGET,你把QML放进去。你能给我指出你的意思吗?我对Qt非常陌生。您可以使用一个基于QtWidgets的应用程序来加载qml,而不是使用
main.cpp
中的常规例程。但这就是我会发现的Hacky这会比GrecKo的解决方案更好吗,也就是说,窗口对点击也是透明的?你能详细说明他是如何从QML内部访问该区域的维度的吗?你能详细说明你的理论吗,即使用
setMask
设置一个掩码,将其设置为hacky吗?既然你是决定面具的那个人,你应该知道它的大小。我认为它在我定义QML中的一切看起来都是很难的,然后我必须确保它实际上在C++层中做我想要的。这意味着我必须知道QML和C++中的各种组件的大小,这使得调整大小变得更复杂。在这里,您有一个包含掩码的属性。因此,你可以从QML和C++中访问它。@马蒂亚斯看到这个项目:PCAN你详细阐述你的理论,使用<代码> SETMADS[/COD] >设置一个掩码,是一个哈奇?既然你是决定面具的那个人,你应该知道它的大小。我认为它在我定义QML中的一切看起来都是很难的,然后我必须确保它实际上在C++层中做我想要的。这意味着我必须知道QML和C++中的各种组件的大小,这使得调整大小变得更复杂。在这里,您有一个包含掩码的属性。所以你可以从QML和C++中访问它。@马蒂亚斯看到这个项目::PI像这个解决方案,但是使用掩码的好处是忽略了区域之外的点击。这和透明度无关。这可能是(联合国)幸运的巧合。我模模糊糊地记得,在macOS上,所有完全透明(不透明度=0)的东西都是不可点击的。在Windows上是不透明的是,在macOS上,单击透明区域会进入下面的窗口。现在不能