前言
QT文档:https://runebook.dev/zh-CN/docs/qt/
QT Quick
和Qt widgets
这两种技术,官方是强推QT Quick
的。
https://player.bilibili.com/player.html?aid=582748160&bvid=BV1p64y1T79J&cid=177627338&page=1
窗口设置
窗口的属性
1 | import QtQuick 2.15 |
无边框
1 | Window { |
注意
flags: Qt.FramelessWindowHint
会让窗口无边框并且不再任务栏显示。如果想无边框并在任务栏显示可以设置:
flags: Qt.Window | Qt.FramelessWindowHint
只显示标题栏
显示标题栏,但是没有关闭最大最小化按钮
1 | Window { |
背景透明无边框窗口
1 | Window { |
opacity这个属性是对当前组件以及子组件都设置不透明度,所以不太适用
color: Qt.rgba(0,0,0,0)
是对当前设置透明度,不会影响子组件
注意
Qt.FramelessWindowHint
无边框Qt.Window
显示在状态栏Qt.WindowStaysOnTopHint
窗口置顶
窗口显示
窗口置顶-属性设置
Qt.WindowStaysOnTopHint: 这个标志使得窗口保持在所有其他常规窗口之上,但可能仍然会在一些系统窗口(如任务栏、通知窗格等)之下。
1 | import QtQuick 2.15 |
窗口置顶-事件触发
永远置顶
1 | mainWin.flags = Qt.Window | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint; |
临时置顶
1 | mainWin.flags = Qt.Window | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint; |
窗口激活
窗口激活会让窗口处于激活状态,但是并不会显示在最前方。
1 | mainWin.requestActivate(); |
窗口恢复
最小化
1 | mainWin.showMinimized(); |
恢复
1 | if (mainWin.windowState === Qt.WindowMinimized){ |
万能窗口临时置顶
无论窗口处于什么状态都能临时置顶的状态
1 | mainWin.flags = Qt.Window | Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint; |
窗口穿透
局部穿透
https://doc.qt.io/qt-5/qwindow.html#setMask
官网是这么说的
The mask is a hint to the windowing system that the application does not want to receive mouse or touch input outside the given region.
意思是
应用不接收给定的区域之外的事件。
工具类
1 | from PySide2 import QtCore |
布局
1 | import QtQuick 2.15 |
程序入口
1 | import sys |
注意
这样其实窗口背景不是透明的也没关系,因为这个方法相当于把穿透的地方都裁剪掉了。
注意上面的例子中传入的坐标区域是不穿透的,
如果想要传入的地方穿透
1
2
3 >fillscreen = window.screen().geometry()
> region = region.xored(fillscreen)
>
把选择的区域反向就行了。
整体穿透
如果整体穿透直接用flags属性设置就行了
1 | Window { |
主要是这个属性Qt.WindowTransparentForInput
窗口拖动
DraggableBar.qml
1 | import QtQuick 2.15 |
拖动区域直接添加
1 | import "components" as Components |
窗口拖动/菜单/托盘
1 | import QtQuick 2.15 |
多窗口
在使用 Qt Quick 和 PySide2 创建多个窗口时,可以通过 QML 和 Python 代码相结合的方式来实现。
以下是一个详细的示例,演示如何在 Python 代码中创建多个窗口。
安装 PySide2
首先确保你已经安装了 PySide2。
你可以使用 pip 来安装:
1 | pip install PySide2 |
创建 QML 文件
main.qml
这是主窗口的 QML 文件:
1 | import QtQuick 2.15 |
secondary.qml
这是次窗口的 QML 文件:
1 | import QtQuick 2.15 |
tertiary.qml
1 | import QtQuick 2.15 |
Python管理窗口
window_manager.py
1 | from PySide2.QtCore import QObject, Slot, QUrl |
主类
main.py
1 | import sys |
窗口的销毁机制
只有一个顶层窗口的情况:
顶层窗口调用close,本窗口销毁并销毁所有子部件;非顶层窗口调用close,窗口只是隐藏,并不销毁。
对于有多个顶层窗口的程序:
情况并不是如此,由于所有窗口都生存在一个QApplication中,只有最后一个窗口关闭close()
之后 程序才会调用主窗口的析构函数来销毁窗口。
Qt Quick中设置窗口关闭自动销毁的属性是无效的,窗口关闭并不会销毁,需要调用deleteLater()
进行销毁。
获取窗口及窗口句柄
1 | root_window = engine.rootObjects()[0] |