使用 Qml 和 PySide6 集成设置窗口掩码

问题描述 投票:0回答:1

我从 PyQt5 迁移到(PySide6 & QML),我想学习。 我想做的就是创建一个真正的圆形窗口或蒙版窗口。 我还需要知道如何与 main.qml 交互并在 python 代码中对其进行更改main.py 例如,如果我需要使用 QMainWindow 的 setTitle 或 setFixedsize 方法 我怎样才能做到这一点?

里面main.qml

import QtQuick 2.15
import QtQuick.Controls 2.15
import Qt5Compat.GraphicalEffects

ApplicationWindow {
    visible: true
    width: 400
    height: 400
    flags: Qt.FramelessWindowHint
    color: "black"

    Rectangle {
        id: root
        anchors.fill: parent
        width: parent.width
        height: parent.height
        color: "transparent"
        radius: 20

        Image {
            id: bgimg
            smooth: false
            anchors.fill: parent
            source: "images/background.png"
        }
    }
}

里面main.py

import sys
from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine


if __name__=="__main__":

    app = QGuiApplication(sys.argv)

    engine = QQmlApplicationEngine()
    engine.quit.connect(app.quit)
    engine.load('main.qml')

    # SET MASK FOR WINDOW HERE

    sys.exit(app.exec())
python pyqt pyqt5 qml pyside6
1个回答
0
投票

您需要的主要东西是

OpacityMask
。为了成功使用它,我们必须进行以下更改:

  1. root
    bgimg
    应该是顶级(现在
    bgimg
    位于
    root
    内部)
  2. root
    bgimg
    应使用
    visible: false
    隐藏。
  3. root
    应该删除
    color: "transparent"
    ,因为它需要有颜色才能使
    OpacityMask
    工作,但这没关系,因为
    visible: false
  4. root
    不应设置
    width
    height
    ,因为这与
    anchors.fill: parent
  5. 冲突
  6. 由于您使用的是 Qt6,因此不再需要导入中的 5.15 版本号

以下是应用的所有更改:

import QtQuick // Removed 2.15 from import
import QtQuick.Controls // Removed 2.15 from import
import Qt5Compat.GraphicalEffects

ApplicationWindow {
    visible: true
    width: 400
    height: 400
    flags: Qt.FramelessWindowHint
    color: "black"

    Rectangle {
        id: root
        anchors.fill: parent
        radius: 20
        visible: false // Added this property
        // Removed color: "transparent"
    }

    Image {
        id: bgimg
        smooth: false
        anchors.fill: parent
        source: "images/background.png"
        visible: false // Added this property
    }

    // Added OpacityMask here
    OpacityMask {
        anchors.fill: parent
        source: bgimg
        maskSource: root
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.