Qt非矩形窗口

时间:2017-09-21 06:40:05

标签: c++ qt qml

我正在尝试用Qt创建一个非矩形窗口。

像这样:

           ______________________
          |                      |
    ______|                      |
  /                              |
 /                               |
|                                |
|                                |
 \                               |
  \_______                       |
          |                      |
          |                      |
          |                      |
          |______________________|

透明部分实际上是点击下面的非Qt窗口。

我找到完成此任务的唯一方法是:window->setMask(complex_region);

但这看起来很糟糕,特别是因为我现在需要知道C ++和qml中窗口部分的大小。

理想情况下,我想告诉Qt不要渲染完全透明的东西。

3 个答案:

答案 0 :(得分:1)

您可以创建一个主要小部件,并使用qpainter绘制设计。所有其他小部件都在主要小部件内。最后,您为主要小部件添加透明度,并且您拥有所需的内容。

答案 1 :(得分:1)

只需将color的{​​{1}}设置为Window并将transparent设置为适用于我的macOS:

non rectangular qml window

答案 2 :(得分:0)

如果你主要担心的是,你想要从QML设置掩码,你可以创建一个可以从QML访问的QObject隧道到方法setMaskmask 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 &region);

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 &region)
{
    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 ++中为暴露的对象添加非常适合的辅助函数