【问题标题】:How to make a transparent window with Qt Quick?如何使用 Qt Quick 制作透明窗口?
【发布时间】:2011-11-28 14:42:25
【问题描述】:

有没有办法让 qml 应用程序的窗口透明?

我正在寻找关于如何使用 qml 绘制简单形状同时使应用程序窗口以及背景透明的详细说明。一个有效的源代码演示会很棒。

【问题讨论】:

  • 我是你的粉丝​:)

标签: c++ qt transparent qml qt-quick


【解决方案1】:

我正在使用带有 C++ 和 QML 的 Qt 5.3,发现我需要调用 QQuickWindow::setDefaultAlphaBuffer。这必须在创建第一个 QQuickWindow 之前完成,因此在 C++ 中,而不是 QML。窗口 color 和 flags 可能可以在 QML 中设置,但我选择将所有用于 winow 透明度的代码放在一个地方,如下所示:

QQuickView view;
QQuickWindow::setDefaultAlphaBuffer(true);
view.setColor(Qt::transparent);
view.setFlags(m_View.flags() | 
              static_cast<Qt::WindowFlags>(Qt::WA_TranslucentBackground));

【讨论】:

    【解决方案2】:

    至少从 Qt 5.3 开始,您不需要像以前的答案那样详细:

    Window {
        flags: Qt.ToolTip | Qt.FramelessWindowHint | Qt.WA_TranslucentBackground
    
        color: "#00000000"
    

    工作完成。 (您可能想更改ToolTip。我正在使用它,因为我正在制作工具提示。)

    【讨论】:

    • 值得一提的是,此解决方案仅适用于我的程序,仅在 main.cpp 中设置 DefaultAlphaBuffer:QQuickWindow::setDefaultAlphaBuffer(true);
    【解决方案3】:

    我终于找到了一种简单的方法来绘制几个红色/蓝色矩形,同时保持窗口透明。

    draw_rectangles.qml

    import Qt 4.7
    
    Item {
         Rectangle {
             opacity: 0.5
             color: "red"
             width: 100; height: 100
             Rectangle {
                 color: "blue"
                 x: 50; y: 50; width: 100; height: 100
             }
         }
     }
    

    win.cpp:

    #include <QApplication>
    #include <QDeclarativeView>
    #include <QMainWindow>
    
    int main(int argc, char *argv[])
    {
        QApplication app(argc, argv);
        QMainWindow window;
    
        QDeclarativeView* v = new QDeclarativeView;
        window.setCentralWidget(v);
    
        v->setSource(QUrl::fromLocalFile(("draw_rectangles.qml")));   
    
        window.setStyleSheet("background:transparent;");
        window.setAttribute(Qt::WA_TranslucentBackground);
        window.setWindowFlags(Qt::FramelessWindowHint);
        window.show();
    
        return app.exec();
    }
    

    win.pro:

    TEMPLATE += app
    QT += gui declarative
    SOURCES += win.cpp
    

    将这些文件保存到同一目录并执行qmake,然后执行make,以编译应用程序。

    【讨论】:

    • -1:虽然是一个不错的演示,但它根本没有解释任何内容。透明的先决条件是什么?简而言之:必须触及什么才能使其正常工作?照原样,我认为它在未来没有用,但最多在当下。 -- 编辑:特别是关于您的问题:“我正在寻找详细说明”。
    【解决方案4】:

    这是一个简单的例子:

    ma​​in.cpp:

    #include <QtGui/QApplication>
    #include "mainwindow.h"
    
    int main(int argc, char *argv[])
    {
        QApplication a(argc, argv);
        MainWindow w;
        w.show();
    
        return a.exec();
    }
    

    ma​​inwindow.h:

    #ifndef MAINWINDOW_H
    #define MAINWINDOW_H
    
    #include <QDeclarativeView>
    
    class MainWindow : public QDeclarativeView
    {
        Q_OBJECT
    
    public:
        MainWindow(QWidget *parent = 0);
        ~MainWindow();
    };
    
    #endif // MAINWINDOW_H
    

    ma​​inwindow.cpp:

    #include "mainwindow.h"
    
    MainWindow::MainWindow(QWidget *parent)
        : QDeclarativeView(parent)
    {
        // transparent background
        setAttribute(Qt::WA_TranslucentBackground);
        setStyleSheet("background:transparent;");
    
        // no window decorations
        setWindowFlags(Qt::FramelessWindowHint);
    
        // set QML file
        setSource(QUrl("main.qml"));
    }
    
    MainWindow::~MainWindow()
    {
    }
    

    ma​​in.qml

    import QtQuick 1.0
    
    Rectangle {
        id: root
    
        width: 250
        height: 250
    
        // completely transparent background
        color: "#00FFFFFF"
    
        border.color: "#F00"
        border.width: 2
    
        Rectangle {
            id: ball
    
            height: 50; width: 50
            x: 100
    
            color: "#990000FF"
            radius: height / 2
        }
    
        SequentialAnimation {
            running: true; loops: Animation.Infinite
            NumberAnimation { target: ball; property: "y"; to: root.height - ball.height; duration: 1000; easing.type: Easing.OutBounce }
            PauseAnimation { duration: 1000 }
            NumberAnimation { target: ball; property: "y"; to: 0; duration: 700 }
            PauseAnimation { duration: 1000 }
        }
    }
    

    transp-qml.pro

    QT += core gui declarative
    
    TARGET = transp-qml
    TEMPLATE = app
    
    
    SOURCES += main.cpp\
               mainwindow.cpp
    
    HEADERS += mainwindow.h
    
    OTHER_FILES += main.qml
    

    结果截图:

    【讨论】:

    • 谢谢!我会 +1,但这是一个复杂的演示,qmake 抱怨 WARNING: Failure to find: main.cpp.
    • @karlphillip:糟糕,刚刚忘记发帖main.cpp ;)
    猜你喜欢
    • 2012-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2023-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多