QtQuick 2 透明窗口背景

3
我一直在寻找如何使我的QtQuick 2.0应用程序的“背景”透明。大多数答案使用的是QtDeclarative,这对于QtQuick 1.0而言还可以,但不适用于版本2。
最后我找到了一个解决办法,但我想知道是否有更好/更简单/更小的方法来实现此任务。
注意*: 我希望将窗口的背景设置为透明。有些人建议使用setOpacity,但这会使所有qml元素都变为透明。
3个回答

3

我在这篇文章http://qt-project.org/forums/viewthread/18984/#106629中找到了解决方案,作者是billouparis。他使用了由QtCreator生成的主应用程序模板,这非常方便。

注意:我稍微修改了原始代码使其更加简洁。
#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include <QSurface>
#include <QSurfaceFormat>
#include <QDebug>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QtQuick2ApplicationViewer viewer;

    // Make Background Transparent Start
    viewer.setSurfaceType(QSurface::OpenGLSurface);

    QSurfaceFormat format;
    format.setAlphaBufferSize(8);
    format.setRenderableType(QSurfaceFormat::OpenGL);

    viewer.setFormat(format);
    viewer.setColor(QColor(Qt::transparent));
    viewer.setClearBeforeRendering(true);
    // Make Background Transparent Stop

    viewer.setMainQmlFile(QStringLiteral("qml/myProject/main.qml"));
    viewer.showExpanded();
    return app.exec();
}

同时确保根QML元素具有alpha颜色(Qt.rgba)


嗨,乔治,我相信即使你删除使用QSurface和QSurfaceFormat的行,它也会正常工作。这将使您的代码更简单。 - JKSH
嗨,George,我尝试了你的代码,但总是得到黑色背景。有什么想法吗? - nikvs
你的 QML 文件中,根元素的颜色是否为透明? - George Sofianos

2

以下是一个纯 QML 实现的获得无框透明窗口的示例:

import QtQuick 2.2
import QtQuick.Window 2.0
import QtQuick.Controls 1.1
import QtQuick.Controls.Styles 1.1

ApplicationWindow {
    id: backlight
    flags: Qt.FramelessWindowHint
    visible: true
    title: qsTr("backlight")
    width: 500
    height: 50
    x: (Screen.width - width) / 2
    y: (Screen.height - height) / 2
    color: "transparent"

    property real slideValue
    signal onSlide(real value)

    Rectangle {
        anchors.centerIn: parent
        width: parent.width
        height: 50
        color: "transparent"

        Rectangle {
            anchors.fill: parent
            radius: 25
            opacity: 0.3
            color: "gray"
        }

        Slider {
            anchors.centerIn: parent
            width: backlight.width - 16
            height: backlight.height
            value: backlight.slideValue
            focus: true
            onValueChanged: backlight.onSlide(value)
            Keys.onSpacePressed: Qt.quit()
            Keys.onEscapePressed: Qt.quit()

            style: SliderStyle {
                groove: Rectangle {
                    implicitHeight: 8
                    radius: 4
                    color: "gray"
                }
                handle: Rectangle {
                    anchors.centerIn: parent
                    color: control.pressed ? "white" : "lightgray"
                    border.color: "gray"
                    border.width: 2
                    width: 34
                    height: 34
                    radius: 17
                }
            }
        }
    }
} 

1
尝试一下。
import QtQuick 2.2
import QtQuick.Window 2.0


 Window {
    id: backlight

    visible: true
    title: qsTr("backlight")
    width: 500
    height: 50
    x: (Screen.width - width) / 2
    y: (Screen.height - height) / 2
    color: "transparent"


    }

这个答案的简单性使它成为最佳选项。使用Qt 5.7、Quick 2.7和Win7进行开发。 - Mark Ch

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