我正在尝试用Qt创建一个非矩形窗口。
像这样:
______________________
| |
______| |
/ |
/ |
| |
| |
\ |
\_______ |
| |
| |
| |
|______________________|
透明部分实际上是点击下面的非Qt窗口。
我找到完成此任务的唯一方法是:window->setMask(complex_region);
但这看起来很糟糕,特别是因为我现在需要知道C ++和qml中窗口部分的大小。
理想情况下,我想告诉Qt不要渲染完全透明的东西。
答案 0 :(得分:1)
您可以创建一个主要小部件,并使用qpainter绘制设计。所有其他小部件都在主要小部件内。最后,您为主要小部件添加透明度,并且您拥有所需的内容。
答案 1 :(得分:1)
答案 2 :(得分:0)
如果你主要担心的是,你想要从QML设置掩码,你可以创建一个可以从QML访问的QObject
隧道到方法setMask
和mask
QWindow
。
我已决定从QML中创建此Object。设计可能会有所改进,但它有效,并且应该概述这个想法。
<强> 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
<强> exposemask.cpp 强>
#include "exposemask.h"
#include <QPixmap>
#include <QBitmap>
#include <QDebug>
ExposeMask::ExposeMask(QObject* parent)
: QObject(parent)
, m_window(nullptr)
{
}
QRegion ExposeMask::regionFromImage(QString path)
{
QPixmap pix(path);
return pix.mask();
}
QRegion ExposeMask::mask() const
{
if (m_window != nullptr)
{
return m_window->mask();
}
else
{
qDebug() << "No Window Set";
}
}
void ExposeMask::setMask(const QRegion ®ion)
{
m_window->setMask(region);
}
void ExposeMask::setWindow(QWindow* win) { m_window = win; }
在 main.cpp - &gt; int main([...])
强>
qmlRegisterType<ExposeMask>("ExposeMask", 1, 0, "ExposeMask");
在 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 ++中为暴露的对象添加非常适合的辅助函数