Как сделать прозрачное окно с Qt Quick? - PullRequest
20 голосов
/ 30 сентября 2011

Есть ли способ сделать окно приложения qml прозрачным?

Я ищу подробное описание о том, как рисовать простые фигуры с помощью qml, при этом делая окно приложения прозрачным, а также фон. Демонстрация работающего исходного кода была бы потрясающей.

Ответы [ 4 ]

21 голосов
/ 30 сентября 2011

Вот простой пример:

main.cpp

#include <QtGui/QApplication>
#include "mainwindow.h"

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QDeclarativeView>

class MainWindow : public QDeclarativeView
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = 0);
    ~MainWindow();
};

#endif // MAINWINDOW_H

mainwindow.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()
{
}

main.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

снимок экрана с результатом:

screenshot

15 голосов
/ 13 июня 2014

По крайней мере, на Qt 5.3 вам не нужно ничего сложного, как в предыдущих ответах:

Window {
    flags: Qt.ToolTip | Qt.FramelessWindowHint | Qt.WA_TranslucentBackground

    color: "#00000000"

Работа выполнена.(Возможно, вы захотите изменить ToolTip. Я использую его, потому что я делаю всплывающие подсказки.)

10 голосов
/ 30 сентября 2011

Наконец-то я нашел простой способ нарисовать пару красных / синих прямоугольников, оставив окно прозрачным.

enter image description here

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 голос
/ 22 октября 2014

Я использую Qt 5.3 с C ++ и QML и обнаружил, что мне нужно вызвать 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));
...