Верхнее прозрачное окно - PullRequest
       36

Верхнее прозрачное окно

0 голосов
/ 11 октября 2018

В настоящее время я изучаю QML и хочу создать круглое прозрачное окно сверху.

Я создал что-то похожее на это, но оно кажется неправильным по нескольким причинам.

Вот мой код:

Window {
    id: app
    visible: true
    width: 70
    height: 70

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

    Rectangle {

        anchors.fill: parent
        radius: parent.width / 2.0

        color: "black"

        MouseArea {
            property point clickPos: "1,1"

            anchors.fill: parent
            drag.target: parent

            onPressed: {
                clickPos  = Qt.point(mouse.x,mouse.y)
            }

            onPositionChanged: {
                var delta = Qt.point(mouse.x-clickPos.x, mouse.y-clickPos.y)
                app.x += delta.x;
                app.y += delta.y;
            }

            onDoubleClicked: app.close()
        }
    }
}

с использованием этих флагов в основном:

QQuickWindow::setDefaultAlphaBuffer(true);

QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);

Основная проблема в том, что фон не прозрачен.

Seems fine

Not fine

Я думаю, это потому, что «круглый» прямоугольник полностью закрашен!?

У меня естьпробовал несколько флагов (Qt.Tool, Qt.Transparent, ...), но ни один из них не работает.

Мне было интересно, начал ли я хорошо делать то, что я хочу (я думаю, что нет), и каково это?лучший способ сделать это.

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

Я работаю на Qt 5.10 и Win7, используя MSVC в качестве компилятора.

Спасибо

РЕДАКТИРОВАТЬ: Добавление прозрачного фона в окно

BackgroundColorWindow

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Я понял это.

При более глубоком поиске в сети и спасибо @dtech, я нашел эту статью

Это была та же самая проблемакак я.Но без @dtech я бы никогда не подумал о проблеме с графической картой, которая привела бы меня к этому решению.

Похоже, вам нужно включить режим aero на окнах, чтобычтобы иметь возможность использовать прозрачность на Qt.

Я активировал режим аэро, а затем повторил попытку данного решения (одного из @dtech), оно работает очень хорошо.

РЕДАКТИРОВАТЬ: Это хорошоизвестная «ошибка» в Qt

Теперь, когда у меня есть решение, оно кажется очевидным, но я не думал об этом раньше.

Спасибо всем

0 голосов
/ 11 октября 2018

Добавив ответ, просто я могу опубликовать изображение, чтобы доказать вам, что все, что вам нужно, это установить цвет:

Window {
    id: app
    visible: true
    width: 70
    height: 70

    flags: Qt.Window | Qt.FramelessWindowHint

    color: "#00000000"

    Rectangle {

        anchors.fill: parent
        radius: parent.width / 2.0

        color: ma.pressed ? "red" : "black"

        MouseArea {
            id: ma
            property point clickPos: "1,1"

            anchors.fill: parent
            drag.target: parent

            onPressed: {
                clickPos  = Qt.point(mouse.x,mouse.y)
            }

            onPositionChanged: {
                var delta = Qt.point(mouse.x-clickPos.x, mouse.y-clickPos.y)
                app.x += delta.x;
                app.y += delta.y;
            }

            onDoubleClicked: app.close()
        }
    }
}

И результат:

enter image description here

Я не использовал ни один из флагов, которые вы устанавливаете в C ++, возможно, setDefaultAlphaBuffer() сломает его для вас.

...