我从 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())
您需要的主要东西是
OpacityMask
。为了成功使用它,我们必须进行以下更改:
root
和 bgimg
应该是顶级(现在 bgimg
位于 root
内部)root
和 bgimg
应使用 visible: false
隐藏。root
应该删除 color: "transparent"
,因为它需要有颜色才能使 OpacityMask
工作,但这没关系,因为 visible: false
root
不应设置 width
和 height
,因为这与 anchors.fill: parent
以下是应用的所有更改:
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
}
}