C++ Qt非矩形窗口
我试图用Qt创建一个非矩形窗口 像这样:C++ Qt非矩形窗口,c++,qt,qml,C++,Qt,Qml,我试图用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 ®ion);
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 ®ion);
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上,单击透明区域会进入下面的窗口。现在不能