03. 窗口设计
一、PySide6窗口运行原理
窗口是图形用户界面(GUI)程序开发的基础,我们平常所见的各种图形界面都是在窗口中放置不同的控件、菜单和工具条,实现不同的动作和目的。图形界面程序开发就是在窗口上放置不同类型的控件、菜单和工具条按钮,并为各个控件、菜单和工具条按钮编写代码使其 “活跃” 起来。
PySide6 的 QtWidgets 模块集中了可视化编程的各种窗口和控件,这些窗口和控件一般都是直接或间接从 QWidget 类继承来的。QWidget 是从 QObject 和 QPaintDevice 类继承而来的,QObject 类主要实现信号和槽的功能,QPaintDevice 类主要实现控件绘制的功能。
QWidget 类通常用作独立显示的窗口,这时窗口上部有标题栏,QWidget 类也可以当作普通的容器控件使用,在一个窗口或其他容器中添加 QWidget,再在 QWidget 中添加其他控件。当一个控件有父窗口时,不显示该控件的标题栏;当控件没有父窗口时,会显示标题栏。常用于独立窗口的类还有 QMainWindow 和 QDialog,它们都是从 QWidget 类继承而来的。
在创建 QWidget 窗口对象之前,需要先介绍一个 QApplication 类。QApplication 类管理可视化 QWidget 窗口,对 QWidget 窗口的运行进行初始化参数设置,并负责 QWidget 窗口的退出收尾工作,因此在创建 QWidget 窗口对象之前,必须先创建一个 QApplication 类的实例,为后续的窗口运行做好准备。
如果不是基于 QWidget 窗口的程序,可以使用 QGuiApplication 类进行初始化,有些程序通过命令行参数执行任务而不是通过 GUI,这时可以使用 QCoreApplication 类进行初始化,以避免初始化占用不必要的资源。
QApplication 类是从 QGuiApplication 类继承来的,QGuiApplication 类为 QWidget 窗口提供会话管理功能,用户退出时可以友好地终止程序,如果终止不了还可以取消对应的进程,可以保存程序的所有状态用于将来的会话。
QGuiApplication 类继承自 QCoreApplication 类,QCoreApplication 类的一个核心功能是提供事件循环(event loop)。这些事件可以来自操作系统,如鼠标、定时器(timer)、网络,以及其他原因产生的事件都可以被收发。通过调用exec() 函数进入事件循环,遇到 quit() 函数退出事件循环,退出时发送 aboutToQuit() 信号,类似于 Python 的 sys 模块的 exit() 方法。
当某个控件发出信号时,sendEvent() 函数立即处理事件,postEvent() 函数把事件放入事件队列以等待后续处理,处于队列中的事件可以通过 removePostedEvent() 方法删除,也可通过 sendPostedEvent() 方法立即处理事件。
由于 QApplication 类进行可视化界面的初始化工作,因此在任何可视化对象创建之前必须先创建 QApplication 对象,而且还可以通过命令行参数设置一些内部状态。QApplication 类的主要功能有处理命令行参数,设置程序的内部初始状态;处理事件,从窗口接收事件,并通过 sendEvent() 和 postEvent() 发送给需要的窗口;获取指定位置处的窗口(widgetAt())、顶层窗口列表(topLevelWidgets()),处理窗口关闭(closeAllWindows())等事件;使用桌面对象信息进行初始化。
二、QWidget窗口的创建
PySide6 的窗口类主要有三种,分别为 QWidget
、QMainWindow
和 QDialog
,其中 QMainWindow 和 QDialog 从 QWidget 类继承而来。要创建和显示窗口,需要用这 3 个类中的任意一个类实例化对象,并让窗口对象显示并运行起来。
我们可以在终端中使用 pip 安装 pyside6 模块。
pip install pyside6
import sys
from PySide6.QtWidgets import QApplication, QWidget
if __name__ == "__main__":
# 1.创建一个QApplication类的实例
app = QApplication(sys.argv)
# 2.创建一个窗口
window = QWidget()
# 3.设置窗口的尺寸
window.resize(300, 150)
# 4.移动窗口
window.move(300, 300)
# 5.设置窗口标题
window.setWindowTitle("基于PySide的桌面应用程序")
# 6.展示窗口
window.show()
# 7.执行exec()方法,进入事件循环,若遇到窗口退出命名,返回整数n
n = app.exec()
# 8.进入程序的主循环并通过exit()函数确保主循环安全结束
sys.exit(n)
窗口类在 PySide6 的 QtWidgets 模块中,使用窗口类之前,需要用 from PySide6.QtWidgets import QWidget, QMainWindow, QDialog
语句把它们导入进来。
第 1 步是创建 QApplication 类的实例对象 app,为窗口的创建进行初始化,其中 sys.argv 是字符串列表,记录启动程序时的程序文件名和运行参数。sys.argv 的第 1 个元素的值是程序文件名及路径,也可以不输入参数 sys.argv 创建 QApplication 实例对象 app。QApplication 可以接受的两个参数是 -nograb 和 -dograb,-nograb 告诉 Python 禁止获取鼠标和键盘事件,-dograb 则忽略 -nograb 选项功能,而不管 -nograb 参数是否存在于命令行参数中。一个程序中只能创建一个 QApplication 实例,并且要在创建窗口前创建。
第 2 步是用不带参数的 QWidget 类创建 QWidget 窗口实例对象 window,该窗口是独立窗口,有标题栏。
第 3 步是窗口实例对象 window 调用 resize()
方法设置窗口的尺寸。
第 4 步是窗口实例对象 window 调用 move()
方法将窗口移动到屏幕的指定位置。
第 5 步是窗口实例对象 window 调用 setWindowTitle()
方法设置窗口的标题。
第 6 步是窗口实例对象 window 调用 show()
方法显示窗口,这时窗口是可见的。
第 7 步是执行 QApplication 实例对象 app 的 exec()
方法,开始窗口的事件循环,从而保证窗口一直处于显示状态。如果窗口上有其他控件,并为控件的消息编写了处理程序,则可以完成相应的动作。如果用户单击窗口右上角的关闭窗口按钮正常退出界面,或者因程序崩溃而非正常终止窗口的运行,都将引发关闭窗口(closeAllWindows()
)事件,这时 app 的方法 exec()
会返回一个整数,如果这个整数是 0 表示正常退出,如果非 0 表示非正常退出。请注意,当执行到 app 的 exec()
方法时,会停止后续语句的执行,直到所有可视化窗体都关闭(退出)后才执行后续的语句。
第 8 步是调用系统模块的 exit()
方法,通知 Python 解释器程序已经结束,如果是 sys.exit(0) 状态,则 Python 认为是正常退出;如果不是 sys.exit(0) 状态,则 Python 认为是非正常退出。无论什么情况,sys.exit() 都会抛出一个异常 SystemExit,这时可以使用 try…except 语句捕获这个异常,并执行 except 中的语句。
三、PySide6可视化编程架构
之前的代码将创建窗口和创建窗口控件的代码与控件的事件代码放到同一段程序中,如果程序非常复杂,控件很多,事件也很多,势必造成代码混杂,程序可读性差,编程效率也不高。为此可以把创建窗口控件的代码放到一个函数或类中,创建窗口的代码放到主程序中,从而使程序的可读性得到提高,也提高了编程效率。
3.1、界面用函数来定义
下面的代码将创建窗口控件的代码放到函数 setupUi() 中。setupUi() 函数的形参是窗口,在主程序中调用 setupUi() 函数,并把窗口实例作为实参传递给 setupUi() 函数,在 setupUi() 函数中往窗口上创建控件。
import sys
from PySide6.QtWidgets import QApplication, QWidget
def setupUi(window):
# 1.设置窗口的尺寸
window.resize(300, 150)
# 2.移动窗口
window.move(300, 300)
# 3.设置窗口标题
window.setWindowTitle("基于PySide的桌面应用程序")
if __name__ == "__main__":
# 1.创建一个QApplication类的实例
app = QApplication(sys.argv)
# 2.创建一个窗口
window = QWidget()
# 3.调用setupUi()函数,将窗口作为实参传递给setupUi()函数
setupUi(window)
# 4.展示窗口
window.show()
# 5.进入程序的主循环并通过exit()函数确保主循环安全结束
sys.exit(app.exec())
3.2、界面用类来定义
下面的程序将创建窗口控件的代码定义到 MyUi 类的 setupUi() 函数中,各个控件是 MyUi 类中的属性,在主程序中用 MyUi 类实例化对象 ui,这样在主程序中就可以用 ui 引用窗口上的任何控件,在主程序中通过 ui 就可以修改控件的参数。
import sys
from PySide6.QtWidgets import QApplication, QWidget
class MyUi:
def setupUi(self, window):
# 1.设置窗口的尺寸
window.resize(300, 150)
# 2.移动窗口
window.move(300, 300)
# 3.设置窗口标题
window.setWindowTitle("基于PySide的桌面应用程序")
if __name__ == "__main__":
# 1.创建一个QApplication类的实例
app = QApplication(sys.argv)
# 2.创建一个窗口
window = QWidget()
# 3.用MyUi类创建实例ui
ui = MyUi()
# 4.调用ui的setupUi()方法,并以窗口作为实参
ui.setupUi(window)
# 5.展示窗口
window.show()
# 6.进入程序的主循环并通过exit()函数确保主循环安全结束
sys.exit(app.exec())
3.3、界面用模块来定义
如果一个界面非常复杂,创建界面控件的代码也就会很多,我们可以使用包和模块来管理,即在程序中创建界面控件的类 MyUi 可以单独存放到一个文件中,在使用的时候用 import 语句把 MyUi 类导入进来,实现控件代码与窗口代码的分离。
class MyUi:
def setupUi(self, window):
# 1.设置窗口的尺寸
window.resize(300, 150)
# 2.移动窗口
window.move(300, 300)
# 3.设置窗口标题
window.setWindowTitle("基于PySide的桌面应用程序")
新建一个 py 文件,在这个 py 文件中用 from myUi import MyUi 语句把 MyUi 类导入进来,在主程序中用ui=MyUi()语句创建 MyUi 类的实例对象 ui,然后就可以用 ui 引用 myUi.py 文件中定义的控件。
import sys
from PySide6.QtWidgets import QApplication, QWidget
from myUi import MyUi
if __name__ == "__main__":
# 1.创建一个QApplication类的实例
app = QApplication(sys.argv)
# 2.创建一个窗口
window = QWidget()
# 3.用MyUi类创建实例ui
ui = MyUi()
# 4.调用ui的setupUi()方法,并以窗口作为实参
ui.setupUi(window)
# 5.展示窗口
window.show()
# 6.进入程序的主循环并通过exit()函数确保主循环安全结束
sys.exit(app.exec())
3.4、界面与逻辑的分离
上面的代码中,可以把创建窗口和对控件操作的代码单独放到一个函数或类中,含有控件的代码称为界面代码,实现控件动作的代码称为逻辑或业务代码。
下面的代码创建 myWidget() 函数,在函数中用 widget=QWidget(parent) 语句创建 QWidget 类的实例对象 widget,这时首先执行的是 QWidget 类的初始化函数 __init__(),经过初始化后的对象成为真正窗口,注意 myWidget() 函数的返回值是窗口实例对象 widget。在主程序中调用 myWidget() 函数,得到返回值,然后显示窗口并进入消息循环。
import sys
from PySide6.QtWidgets import QApplication, QWidget
from myUi import MyUi
def myWidget(parent = None):
# 1.创建QWidget类的对象,调用QWidget类的__init__()方法
widget = QWidget(parent)
# 2.实例化myUi.py文件中的MyUi类
ui = MyUi()
# 3.调用myUi类的setupUi()方法,以widget为实参传递给形参window
ui.setupUi(widget)
# 4.函数的返回值就是窗口实例对象
return widget
if __name__ == "__main__":
# 1.创建一个QApplication类的实例
app = QApplication(sys.argv)
# 2.创建一个窗口
window = myWidget()
# 3.展示窗口
window.show()
# 4.进入程序的主循环并通过exit()函数确保主循环安全结束
sys.exit(app.exec())
上面代码中,只是用一个函数将界面与逻辑或业务分离,如果要对界面进行多种操作或运算,显然只用一个函数来定义是不够的。由于在类中可以定义多个函数,因而如果用类来代替上述函数,就可以极大地提高编程效率。为此可以把创建窗口和对控件操作的代码放到一个类中。
下面的代码创建一个类 MyWidget,其父类是窗口类 QWidget,在初始化函数 __init__() 中用 super() 函数调用父类的初始化函数,这时类 MyWidget 中的 self 将会是窗口类 QWidget 的实例对象,也就是一个窗口。在主程序中用类 MyWidget 实例化对象 myWindow,myWindow 就是 MyWidget 的 self 的具体值。myWindow可以显示出来,也可以进入事件循环。
import sys
from PySide6.QtWidgets import QApplication, QWidget
from myUi import MyUi
class MyWidget(QWidget):
def __init__(self, parent=None):
# 1.调用父类Qwidget类的__init__()方法
super().__init__(parent)
# 2.实例化myUi.py文件中的MyUi类
ui = MyUi()
# 3.调用myUi类的setupUi()方法,以self为实参传递给形参window
ui.setupUi(self)
if __name__ == "__main__":
# 1.创建一个QApplication类的实例
app = QApplication(sys.argv)
# 2.创建一个窗口
window = MyWidget()
# 3.展示窗口
window.show()
# 4.进入程序的主循环并通过exit()函数确保主循环安全结束
sys.exit(app.exec())
上面的程序属于单继承的方法,自定义类 MyWidget 只继承了 QWidget 类,在类 MyWidget 中还要定义类 MyUi 的实例对象。我们可以使用多继承的方法,自定义类 MyWidget 同时继承 QWidget 类和 MyUi 类,多继承无须再定义类 MyUi 的实例对象,类中的 self 既指 QWidget 类的窗口对象,也指 MyUi 的实例对象,即窗口上的控件。
import sys
from PySide6.QtWidgets import QApplication, QWidget
from myUi import MyUi
class MyWidget(QWidget, MyUi):
def __init__(self, parent=None):
# 1.调用父类的__init__()方法
super().__init__(parent)
# 2调用myUi类的setupUi()方法,以self为实参传递给形参window
self.setupUi(self)
if __name__ == "__main__":
# 1.创建一个QApplication类的实例
app = QApplication(sys.argv)
# 2.创建一个窗口
window = MyWidget()
# 3.展示窗口
window.show()
# 4.进入程序的主循环并通过exit()函数确保主循环安全结束
sys.exit(app.exec())
四、窗口的基本属性设置
窗口包含一些基本的组成要素,包括对象名称、图标、标题、位置和背景等。这些要素可以通过 Qt Designer 中的 “属性编辑器” 窗口进行设计,也可以通过代码来实现。
QWidget 通用窗口常见的属性如下:
objectName # 窗口的唯一标识,程序通过该属性调用窗口
geometry # 该属性中可以设置窗口的宽度和高度
windowTitle # 标题栏文本
windowIcon # 窗口的标题栏图标
windowOpacity # 窗口的透明度,取值范围为 0~1
windowModality # 窗口样式,可选值有 NonModal、WindowModal 和 ApplicationModal
enable # 窗口是否可用
minimumSize # 窗口最小化时的大小,默认为 0×0
maximumSize # 窗口最大化时的大小,默认为 16777215×16777215
palette # 窗口的调色板,可以用来设置窗口的背景
font # 设置窗口的字体,包括字体名称、字体大小、是否为粗体、是否为斜体、是否有下划线、是否有删除线等
cursor # 窗口的鼠标样式
contextMenuPolicy # 窗口的快捷菜单样式
acceptDrops # 是否接受拖放操作
toolTip # 窗口的提示文本
toolTipDuration # 窗口的提示文本的显示间隔
statusTip # 窗口的状态提示
whatsThis # 窗口的 “这是什么” 提示
layoutDirection # 窗口的布局方式,可选值有 LeftToRight、RightToLeft 和 LayoutDirectionAuto
autoFillBackground # 是否自动填充背景
styleSheetlocale # 设置窗口样式,可以用来设置窗口的背景
locale # 设置窗口的国际化设置
QMainWindow 类新增的属性:
iconSize # 窗口标题栏图标的大小
toolButtonStyle # 窗口中的工具栏样式,默认值为 ToolButtonIconOnly,表示默认工具栏只是显示图标用户可以更改为只显示文本,或同时显示文本和图标
dockOptions # 停靠选项
unifiedTitleAndToolBarOnMac # 在MacOS系统中是否可以定义标题和工具栏
QWidget 类的常用方法如下:
# 实例方法
setVisible(visible:bool) -> None # 设置窗口是否可见
setWindowIcon(icon:QIcon) -> None # 设置窗口图标
windowIcon() -> QIcon # 获取窗口图标
setWindowIconText (arg__1:str) -> None # 设置窗口图标文本
windowIconText() -> str # 获取窗口图标文本
windowTitle() -> str # 获取窗口标题
isWindowModified() -> bool # 获取窗口是否被修改过
isModal() -> bool # 获取窗口是否模态
setWindowModality(windowModality:Qt.WindowModality) -> None # 设置窗口模态
setWindowOpacity(level:float) -> None # 设置窗口透明度
windowOpacity() -> float # 获取窗口透明度
setWindowState(state:Qt.WindowStates) -> None # 设置窗口状态
windowState() -> Qt.WindowStates # 获取窗口状态
activateWindow() -> None # 激活窗口
isActiveWindow() -> bool # 获取窗口是否激活
setMinimumHeight(minh:int) -> None # 设置最小高度
setMinimumWidth(minw:int) -> None # 设置最小宽度
setMinimumSize(minw:int, minh:int) -> None # 设置最小尺寸
setMinimumSize(minsize:QSize) -> None # 设置最小尺寸
setMaximumHeight(maxh:int) -> None # 设置最大高度
setMaximumWidth(maxw:int) -> None # 设置最大宽度
setMaximumSize(maxw:int, maxh:int) -> None # 设置最大尺寸
setMaximumSize(maxsize:QSize) -> None # 设置最大尺寸
setFixedHeight(h:int) -> None # 设置固定高度
setFixedWidth(w:int) -> None # 设置固定宽度
setFixedSize(w:int, h:int) -> None # 设置固定尺寸
setFixedSize(size:QSize) -> None # 设置固定尺寸
isMinimized() -> bool # 获取窗口是否最小化
isMaximized() -> bool # 获取窗口是否最大化
isFullScreen() -> bool # 获取窗口是否全屏
setAutoFillBackground(enabled:bool) -> None # 设置窗口背景是否自动填充
autoFillBackground() -> bool # 获取窗口背景是否自动填充
setFont(font:QFont) -> None # 设置窗口字体
font() -> QFont # 获取窗口字体
setPalette(palette:QPalette) -> None # 设置窗口调色板
palette() -> QPalette # 获取窗口调色板
setCursor(cursor:QCursor) -> None # 设置窗口光标
cursor() -> QCursor # 获取窗口光标
unsetCursor() -> None # 移除窗口光标,使用父窗口光标
setUpdatesEnabled(enable:bool) -> None # 设置窗口更新
update(x:int, y:int, w:int, h:int) -> None # 更新窗口指定区域
update(arg__1:QRect) -> None # 更新窗口指定区域
setLayout(layout:QLayout) -> None # 设置窗口布局
layout() -> QLayout # 获取窗口布局
setLayoutDirection(direction:Qt.LayoutDirection) -> None # 设置窗口布局方向
isWindow() -> bool # 获取是否为独立窗口
window() -> QWidget # 获取窗口
addAction(action:QAction) -> None # 添加动作到窗口
addActions(actions:Sequence[QAction]) -> None # 添加动作到窗口
insertAction(before:QAction, action:QAction) -> None # 在指定动作之前插入动作
insertActions(before:QAction, actions:Sequence[QAction]) -> None # 在指定动作之前插入动作
actions() -> Sequence[QAction] # 获取动作列表
repaint(x:int, y:int, w:int, h:int) -> None # 重绘窗口
repaint(arg__1:Union[QRegion, QPolygon, QRect]) -> None # 重绘窗口
scroll(dx:int, dy:int) -> None # 滚动窗口
scroll(dx:int, dy:int, arg__3:QRect) -> None # 滚动窗口
resize(w:int, h:int) -> None # 重新设置窗口尺寸
resize(size:QSize) -> None # 重新设置窗口尺寸
size() -> QSize # 获取窗口尺寸
move(x:int, y:int) -> None # 移动窗口
move(arg__1:QPoint) -> None # 移动窗口
pos() -> QPoint # 获取窗口左上角位置
x() -> int # 获取窗口左上角位置的x坐标
y() -> int # 获取窗口左上角位置的y坐标
frameGeometry() -> QRect # 获取包含标题栏的外框架区域
frameSize() -> QSize # 获取包含标题栏的外框架的尺寸
setGeometry(x:int, y:int, w:int, h:int) -> None # 设置窗口位置和尺寸
setGeometry(arg__1:QRect) -> None # 设置窗口位置和尺寸
geometry() -> QRect # 获取窗口位置和尺寸
# 槽函数
show() -> None # 显示窗口,等同于setVisible(True)
setHidden(hidden:bool) -> None # 设置窗口是否隐藏
hide() -> None # 隐藏窗口
raise_() -> None # 提升控件,放到控件栈的顶部
lower() -> None # 降低控件,放到控件栈的底部
setWindowTitle(title:str) -> None # 设置窗口标题
setWindowModified(arg__1:bool) -> None # 设置窗口是否被修改过
showMinimized() -> None # 最小化显示
showMaximized() -> None # 最大化显示
showNormal() -> None # 最小化显示或者最大化显示后回到正常显示
showFullScreen() -> None # 全屏显示
update() -> None # 更新窗口
setFocus() -> None # 设置窗口焦点
用 show()
方法可以显示窗口,用 hide()
方法可以隐藏窗口,也可以用 setVisible(bool)
方法和 setHidden(bool)
方法设置窗口的可见性,用 isVisible()
和 isHidden()
方法判断窗口是否可见,用 close()
方法可以关闭窗口。当窗口被关闭时,首先向这个窗口发送一个关闭事件 closeEvent(event:QCloseEvent)
,如果事件被接受,则窗口被隐藏;如果事件被拒绝,则什么也不做。如果创建窗口时用 setAttribute(Qt.WA_QuitOnClose,on=True)
方法设置了 Qt.WA_QuitOnClose 属性,则窗口对象会被析构(删除),大多数类型的窗口都默认设置了这个属性。close()
方法的返回值 bool 表示关闭事件是否被接受,也就是窗口是否真的被关闭了。
独立窗口有正常、全屏、最大化、最小化几种状态,用 isMinimized()
方法判断窗口是否为最小化,用 isMaximized()
方法判断窗口是否为最大化,用 isFullScreen()
方法判断窗口是否为全屏,用 showMinimized()
方法设置以最小化方式显示窗口,用 showMaximized()
方法设置以最大化方式显示窗口,用 showFullScreen()
方法设置以全屏方式显示窗口,用 showNormal()
方法设置以正常方式显示窗口。另外用 setWindowState(Qt.WindowStates)
方法也可以设置窗口的状态,其中参数 Qt.WindowStates 可以取值如下:
Qt.WindowStates.WindowNoState # 无标识,正常状态
Qt.WindowStates.WindowMinimized # 最小化状态
Qt.WindowStates.WindowMaxmized # 最大化状态
Qt.WindowStates.WindowFullScreen # 全屏状态
Qt.WindowStates.WindowActive # 激活状态
在主窗口中通常需要弹出一些需要进行设置或确认信息的对话框,在对话框没有关闭之前,通常不能对其他窗口进行操作,这就是窗口的模式。用 setWindowModality(Qt.WindowModality)
方法设置窗口的模式特性,其中枚举参数Qt.WindowModality可以取值如下:
Qt.WindowModality.NonModal # 非模式,可以和程序的其他窗口进行交互操作
Qt.WindowModality.WindowModal # 窗口模式,在未关闭当前窗口时,将阻止与该窗口的父辈窗口的交互操作
Qt.WindowModality.ApplicationModal # 应用程序模式,在未关闭当前窗口时,将阻止窗口与任何其他窗口的交互操作
当有多个独立窗口同时存在时,只有一个窗口能够处于活跃状态。系统产生的键盘、鼠标等输入事件将被发送给处于活跃状态的窗口。一般来说,这样的窗口会被提升到堆叠层次的最上面,除非其他窗口有总在最上面的属性。用 activateWindow()
方法可以使窗口活跃,用 isActiveWindow()
方法可以查询窗口是否活跃。
处于激活状态的窗口才有可能处理键盘和鼠标等输入事件;反之,处于禁用状态的窗口不能处理这些事件。用 setEnabled(bool)
方法或 setDisabled(bool)
方法可以使窗口激活或失效,用 isEnabled()
方法可以查询窗口是否处于激活状态。
用 setLayout(QLayout)
方法可以设置窗口的布局,用 layout()
方法可以获取窗口的布局,用 setLayoutDirection(Qt.LayoutDirection)
方法可以设置布局的方向,其中参数 Qt.LayoutDirection 可以取值如下:
Qt.LayoutDirection.LeftToRight
Qt.LayoutDirection.RightToLeft
Qt.LayoutDirection.LayoutDirectionAuto
用 setAttribute(Qt.WidgetAttribute,on=True)
方法可以设置窗口的属性,用 testAttribute(Qt.WidgetAttribute)
方法可以测试是否设置了某个属性,其中参数 Qt.WidgetAttribute 的常用取值如下:
Qt.WidgetAttribute.WA_DeleteOnClose # 调用close()方法时删除窗口而不是隐藏窗口
Qt.WidgetAttribute.WA_QuitOnClose # 最后一个窗口如果有Qt.WidgetAttribute.WA_DeleteOnClose属性,则执行close()方法时退出程序
Qt.WidgetAttribute.WA_AcceptDrops # 接受鼠标拖放的数据
Qt.WidgetAttribute.WA_AlwaysShowToolTips # 窗口失效时也显示信息
Qt.WidgetAttribute.WA_Disabled # 窗口处于失效状态,不接收键盘和鼠标的输入
Qt.WidgetAttribute.WA_DontShowOnScreen # 窗口隐藏
Qt.WidgetAttribute.WA_ForceDisabled # 即使父窗口处于激活状态,窗口也强制失效
Qt.WidgetAttribute.WA_TransparentForMouseEvents # 窗口和其子窗口忽略鼠标事件
Qt.WidgetAttribute.WA_RightToLeft # 布局方向从右到左
Qt.WidgetAttribute.WA_ShowWithoutActivating # 当不激活窗口时,显示窗口
在窗口或控件上右击鼠标时,将弹出右键快捷菜单(上下文菜单),用 setContextMenuPolicy(policy:Qt.ContextMenuPolicy)
方法设置弹出快捷菜单的策略和处理方式,其中 policy 是 Qt.ContextMenuPolicy 的枚举值,可以取值如下:
Qt.ContextMenuPolicy.NoContextMenu # 控件没有自己特有的快捷菜单,使用控件父窗口或父容器的快捷菜单
Qt.ContextMenuPolicy.DefaultContextMenu # 鼠标右键事件交给控件的额contextMenuEvent()函数处理
Qt.ContextMenuPolicy.ActionsContextMenu # 右键快捷菜单是控件或窗口的actions()方法获取的动作
Qt.ContextMenuPolicy.CustomContextMenu # 用户自定义快捷菜单,右击鼠标时,发射customContextMenuRequest(QPoint)信号
Qt.ContextMenuPolicy.PreventContextMenu # 鼠标右键事件交给控件的mousePressEvent()和mouseReleaseEvent()函数进行处理
QWidget 类的常用信号如下:
customContextMenuRequested(pos:QPoint) # 通过setContextMenuPolicy(Qt.CustomContextMenu)方法设置快捷菜单时自定义菜单,此时右击鼠标时发射信号
windowIconChanged(icon:QIcon) # 窗口图标改变时发射信号
windowIconTextChanged(iconText:str) # 窗口标题改变时发射信号
windowTitleChanged(title:str) # 窗口标题改变时发射信号
from PySide6.QtGui import QIcon, QPixmap
class MyUi:
def setupUi(self, window):
# 1.设置窗口的唯一标识
window.setObjectName("MainWindow")
# 2.设置窗口对象的位置和大小
# 前两个值指定窗口位置,后两个值指定窗口大小
window.setGeometry(300, 300, 700, 500)
# 3.设置窗口图标
icon = QIcon()
icon.addPixmap(QPixmap("1.ico"))
window.setWindowIcon(icon)
# 4.设置窗口标题
window.setWindowTitle("基于PySide6的桌面应用程序")
# 5.设置窗口的背景
# 设置背景颜色
# w.setStyleSheet("#MainWindow{background-color:pink}")
window.setStyleSheet("background-color:pink")
# 6.设置窗口透明图
window.setWindowOpacity(0.8)
五、设置窗口样式
在 PySide 中,使用 setWindowFlags(PySide6.QtCore.Qt.WindowFlags)
设置窗口的样式。其中,PySide6.QtCore.Qt.WindowFlags 参数表示要设置的窗口样式,它的取值范围内为两种类型。
【1】、PySide 的基本窗口类型及其说明
Qt.Widget # 默认窗口,有最大化、最小化和关闭按钮
Qt.Window # 普通窗口,有最大化、最小化和关闭按钮
Qt.Dialog # 对话框窗口,有关闭按钮
Qt.Popup # 无边框的弹出窗口
Qt.ToolTip # 无边框的提示窗口,没有任务栏
Qt.SplashScreen # 无边框的闪屏窗口,没有任务栏
Qt.SubWindow # 子窗口,窗口没有按钮,但有标题
【2】、自定义顶层窗口外观及其说明
Qt.MSWindowsFixedSizeDialogHint # 无法调整窗口的大小
Qt.FramelessWindowHint # 无边框窗口
Qt.CustomizeWindowHint # 有边框但无标题栏和按钮,不能移动和拖动的窗口
Qt.WindowTitleHint # 添加标题栏和一个关闭按钮的窗口
Qt.WindowSystemMenuHint # 添加系统目录和一个关闭按钮的窗口
Qt.WindowMaximizeButtonHint # 激活最大化按钮的窗口
Qt.WindowMinimizeButtonHint # 激活最小化按钮的窗口
Qt.WindowMinMaxButtonsHint # 激活最小化和最大化按钮的窗口
Qt.WindowCloseButtonHint # 添加一个关闭按钮的窗口
Qt.WindowContextHelpButtonHint # 添加向对框框一样的问号和关闭按钮的窗口
Qt.WindowStaysOnTopHint # 使窗口始终处于顶层位置
Qt.WindowStaysOnBottomHint # 使窗口始终处于底层位置
from PySide6.QtCore import Qt
from PySide6.QtGui import QIcon, QGuiApplication
class MyUi:
def setupUi(self, window):
# 1.设置窗口的唯一标识
window.setObjectName("MainWindow")
# 2.设置窗口对象大小
window.resize(700, 500)
# 3.设置窗体居中显示
screen_size = QGuiApplication.primaryScreen().size()
size = window.size()
window.move((screen_size.width() - size.width()) / 2, (screen_size.height() - size.height()) / 2)
# 4.设置窗口图标
icon = QIcon("1.ico")
window.setWindowIcon(icon)
# 5.设置窗口标题
window.setWindowTitle("基于PySide的桌面应用程序")
# 6.设置窗口的背景
# 设置背景图片,如果使用 background-image 图片会平铺显示
# w.setStyleSheet("#MainWindow{border-image:url(1.jpeg)}")
window.setStyleSheet("border-image:url(1.jpeg)")
# 7.设置窗口样式
window.setWindowFlags(Qt.MSWindowsFixedSizeDialogHint | Qt.WindowStaysOnTopHint)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!