8

我将 QQmlApplicationEngine 与 QQuickWindow 用于应用程序,但我无法透明主窗口。我想在应用程序弹出之前设置一个启动画面,我使用 Window 组件,它应该是透明的,但它不是,我的 main.cpp 是

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

QShookaClient shooka_client;
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("shooka", &shooka_client);
engine.load(QUrl("qrc:///shooka/shooka.qml"));

QObject *topLevel = engine.rootObjects().value(0);
QQuickWindow *window = qobject_cast<QQuickWindow *>(topLevel);

window->show();
window->setFlags(Qt::FramelessWindowHint);
window->setColor(Qt::transparent);

return app.exec();
}

但是setColor在win7中不起作用。我知道 QDeclarativeView 有办法,甚至我找到了 QQuickview 的解决方案,它应该适用于 QQuickWindow 但不,任何人都可以帮助我..

4

3 回答 3

6

必须意识到WindowQtQuick 类型映射到QQuickWindowC++ 类,并且派生自QWindow. 根据卡梅伦的回答,可以设置窗口标志。但是您还需要将其设置为opacity0.75 以使其半透明。所有这些都可以在 QML 中完成,无需从 C++ 设置标志。

截屏

import QtQuick 2.1
import QtQuick.Controls 1.0
import QtQuick.Window 2.0

ApplicationWindow {
    title: qsTr("Hello World")
    width: 640
    height: 480
    flags: Qt.SubWindow | Qt.Tool | Qt.FramelessWindowHint | Qt.WindowSystemMenuHint | Qt.WindowStaysOnTopHint
    opacity: 0.75
    visible: true
    menuBar: MenuBar {
        Menu {
            title: qsTr("File")
            MenuItem {
                text: qsTr("Exit")
                onTriggered: Qt.quit();
            }
        }
    }
    Button {
        text: "Hello World"
        anchors.centerIn: parent
    }
}
于 2013-08-30T19:38:06.177 回答
5

我知道这是一个老问题,但由于它没有被标记为已解决,这是我的方法:

import QtQuick 2.4
import QtQuick.Controls 1.3

ApplicationWindow {
    title: qsTr("Hello World")
    width: 640
    height: 480
    flags: Qt.FramelessWindowHint
    color: "transparent"
    visible: true
    Rectangle
    {
        color:"red"
        width: parent.width/2
        height: parent.height/2;anchors.centerIn: parent
    }
}

结果,您将获得一个透明背景,中间有一个红色矩形。您可以轻松更改图像的矩形。

希望帮助了某人。

于 2015-03-01T10:08:31.553 回答
0

您可以考虑使用以下代码来实现无框透明窗口效果:

setWindowFlags(
        #ifdef Q_OS_MAC
            Qt::SubWindow |
        #else
            Qt::Tool |
        #endif
            Qt::FramelessWindowHint |
            Qt::WindowSystemMenuHint |
            Qt::WindowStaysOnTopHint
        );

setAttribute(Qt::WA_NoSystemBackground, true);
// set the parent widget's background to translucent
setAttribute(Qt::WA_TranslucentBackground, true);

setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed);
// create a display widget for displaying child widgets
QWidget* displayWidget = new QWidget;
displayWidget->setStyleSheet(".QWidget { background-color: rgba(0, 0, 0, 75%); border-width: 1px; border-style: solid; border-radius: 10px; border-color: #555555; } .QWidget:hover { background-color: rgba(68, 68, 68, 75%); border-width: 2px; border-style: solid; border-radius: 10px; border-color: #ffffff; }");

这个想法是您的父窗口或包含窗口没有框架并且具有半透明背景。然后在父 QWidget 中嵌套一个子 QWidget,并使用 QSS 应用样式以实现透明度。

于 2013-08-30T14:46:58.997 回答