顶层窗口相关
- 图标
设置窗口图标:setWindowIcon(QIcon("resource/header_icon.png")) 获取窗口图标对象:windowIcon()
- 标题
设置窗口标题:setWindowTitle("HelloWorld") 获取窗口标题:windowTitle()
- 不透明度
设置不透明度:setWindowOpacity(float) 参数:0.0 ~ 1.0 数值越小,窗口背景越透明 获取不透明度:windowOpacity()
- 窗口状态
设置窗口状态:setWindowState(state) 参数:Qt.WindowNoState # 无状态 Qt.WindowMinimized # 最小化 Qt.WindowMaximized # 最大化 Qt.WindowFullScreen # 全屏 Qt.WindowActive # 激活当前窗口 获取窗口状态:windowState()
- 窗口最大/最小化显示
控制窗口显示状态: showFullScreen() # 全屏显示窗口,不包含窗口框架(标题栏) showMaximized() # 最大化显示库存,包含窗口框架 showMinimized() # 最小化显示窗口,包含窗口框架 showNormal() # 显示标准大小窗口,包含窗口框架 判断窗口显示状态: isMinimized() # 是否是最小化窗口 isMaximized() # 是否是最大化窗口 isFullScreen() # 是否是全屏
- 一般设置窗口最大/最小化都是通过窗口最大/最小显示设置。窗口状态的方式设置最大/最小化用于制作自定义标题栏时
- 窗口标志
设置窗口标志:window.setWindowFlags(Qt.WindowStaysOnTopHint) 窗口样式参数: Qt.Widget # 默认。是一个窗口或者控件。 # 有父控件,就是一般控件。 # 没父控件,就是窗口,有窗口边框和标题栏(图标、标题、最小化、最大化、关闭) Qt.Window # 是一个窗口,有窗口边框和标题栏(图标、标题、最小化、最大化、关闭) Qt.Dialog # 是一个对话框窗口,有窗口边框和标题栏(图标、标题、问号、关闭) Qt.Sheet # 是一个窗口或部件Macintosh表单 Qt.Drawer # 是一个窗口或部件Macintosh抽屉 Qt.Popup # 是一个弹出式顶层窗口,没有窗口边框和标题栏 Qt.Tool # 是一个工具窗口 Qt.ToolTip # 是一个提示窗口,没有标题栏和窗口边框 Qt.SplashScreen # 是一个欢迎窗口,是QSplashScreen构造函数的默认值 Qt.SubWindow # 是一个子窗口 顶层窗口外观标志参数: Qt.MSWindowsFixedSizeDialogHint # 窗口无法调整大小 Qt.FramelessWindowHint # 窗口无边框 Qt.CustomizeWindowHint # 有边框但无标题栏和按钮,不能移动和拖动。 Qt.WindowTitleHint # 添加标题栏和一个不可用的关闭按钮 Qt.WindowSystemMenuHint # 添加系统目录和一个关闭按钮 Qt.WindowMaximizeButtonHint # 激活最大化和关闭按钮,禁止最小化按钮 Qt.WindowMinimizeButtonHint # 激活最小化和关闭按钮,禁止最大化按钮 Qt.WindowMinMaxButtonsHint # 激活最小化,最大化和关闭按钮 Qt.WindowCloseButtonHint # 添加一个关闭按钮 Qt.WindowContextHelpButtonHint # 添加问号和关闭按钮,同对话框 Qt.WindowStaysOnTopHint # 窗口始终处于顶层位置(QQ登录界面) Qt.WindowStaysOnBottomHint # 窗口始终处于底层位置 获取窗口样式:windowFlags()
-
窗口标志样图
- Qt.Widget:默认。是一个窗口或者控件。
- Qt.Window:是一个窗口,有窗口边框和标题栏(图标、标题、最小化、最大化、关闭)
- Qt.Dialog:是一个对话框窗口,有窗口边框和标题栏(图标、标题、问号、关闭)
- Qt.Sheet:是一个窗口或部件Macintosh表单
- Qt.Drawer:是一个窗口或部件Macintosh抽屉
- Qt.Popup:是一个弹出式顶层窗口,没有窗口边框和标题栏
- Qt.Tool:是一个工具窗口
- Qt.ToolTip:是一个提示窗口,没有标题栏和窗口边框
- Qt.SplashScreen:是一个欢迎窗口,是QSplashScreen构造函数的默认值
- Qt.SubWindow:是一个子窗口
- Qt.Widget:默认。是一个窗口或者控件。
-
顶层窗口外观标志
- Qt.MSWindowsFixedSizeDialogHint:窗口无法调整大小
- Qt.FramelessWindowHint:窗口无边框
- Qt.CustomizeWindowHint:有边框但无标题栏和按钮,不能移动和拖动
- Qt.WindowTitleHint:添加标题栏和一个不可用的关闭按钮
- Qt.WindowSystemMenuHint:添加系统目录和一个不可用的关闭按钮
- Qt.WindowMaximizeButtonHint:激活最大化,禁止最小化按钮和关闭按钮
- Qt.WindowMinimizeButtonHint:激活最小化,禁止最大化按钮和关闭按钮
- Qt.WindowMinMaxButtonsHint:激活最小化和最大化,禁止关闭按钮
- Qt.WindowCloseButtonHint:添加一个关闭按钮
- Qt.WindowContextHelpButtonHint:添加问号和不可用关闭按钮,同对话框
- Qt.WindowStaysOnTopHint:窗口始终处于顶层位置(QQ登录界面)
- Qt.WindowStaysOnBottomHint:窗口始终处于底层位置
- Qt.MSWindowsFixedSizeDialogHint:窗口无法调整大小
- 1~5 示例
from PyQt5.Qt import * import sys app = QApplication(sys.argv) window = QWidget() window.resize(500, 500) w1 = QWidget() w1.setWindowTitle('W1') w2 = QWidget() w2.setWindowTitle('W2') # 设置窗口图标 img1 = "./images/logo1.jpg" img2 = "./images/logo2.png" img3 = "./images/logo3.ico" # 创建QIcon对象,传入图片地址 icon = QIcon(img3) # 设置窗口图标 window.setWindowIcon(icon) # 获取窗口图标 print('windowIcon:',window.windowIcon()) # 设置窗口标题 window.setWindowTitle('窗口特定操作1') # 获取窗口标题 print('windowTitle:',window.windowTitle()) # 设置窗口不透明度(0.0 ~ 1.0) window.setWindowOpacity(0.8) # 获取窗口不透明度 print('windowOpacity:',window.windowOpacity()) # w1.show() # w2.show() # window.show() # 设置窗口状态 # window.setWindowState(Qt.WindowMaximized) # 窗口最大化 # window.setWindowState(Qt.WindowMinimized) # 窗口最小化 # window.setWindowState(Qt.WindowNoState) # 窗口无状态(正常大小) # window.setWindowState(Qt.WindowFullScreen) # 窗口全屏(没有边框)Alt+F4可以关闭 # w2.setWindowState(Qt.WindowActive) # 激活当前窗口(选中当前窗口) # 获取窗口当前状态 print('获取窗口状态1:',window.windowState() == Qt.WindowMaximized) # 窗口显示状态 # window.showNormal() # 标准大小显示窗口 window.showMaximized() # 最大化显示窗口 # window.showMinimized() # 最小化显示窗口 # window.showFullScreen() # 全屏显示窗口 # 判断窗口状态 if window.isMaximized(): print('最大化显示窗口') elif window.isMinimized(): print('最小化显示窗口') elif window.isFullScreen(): print('全屏显示窗口') else: print('标准大小显示窗口') print('获取窗口状态2:',window.windowState() == Qt.WindowMaximized) sys.exit(app.exec_())
- 输出结果
windowIcon: <PyQt5.QtGui.QIcon object at 0x0000017FEDFEC5E0> windowTitle: 窗口特定操作1 windowOpacity: 0.8 获取窗口状态1: False 最大化显示窗口 获取窗口状态2: True
- 窗口标志示例
from PyQt5.Qt import * import sys app = QApplication(sys.argv) window = QWidget() window.resize(800, 300) str = 'Qt.WindowStaysOnBottomHint' window.setWindowTitle(str) label = QLabel(window) label.setStyleSheet('font-size:40px;') label.move(10, 100) label.setText(str) # 窗口样式 window.setWindowFlags(Qt.Widget) # 默认。是一个窗口或者控件。 # window.setWindowFlags(Qt.Window) # 是一个窗口,有窗口边框和标题栏(图标、标题、最小化、最大化、关闭) # window.setWindowFlags(Qt.Dialog) # 是一个对话框窗口,有窗口边框和标题栏(图标、标题、问号、关闭) # window.setWindowFlags(Qt.Sheet) # 是一个窗口或部件Macintosh表单 # window.setWindowFlags(Qt.Drawer) # 是一个窗口或部件Macintosh抽屉 # window.setWindowFlags(Qt.Popup) # 是一个弹出式顶层窗口 # window.setWindowFlags(Qt.Tool) # 是一个工具窗口 # window.setWindowFlags(Qt.ToolTip) # 是一个提示窗口,没有标题栏和窗口边框 # window.setWindowFlags(Qt.SplashScreen) # 是一个欢迎窗口,是QSplashScreen构造函数的默认值 # window.setWindowFlags(Qt.SubWindow) # 是一个子窗口 # 顶层窗口外观标志 # window.setWindowFlags(Qt.MSWindowsFixedSizeDialogHint) # 窗口无法调整大小 # window.setWindowFlags(Qt.FramelessWindowHint) # 窗口无边框 # window.setWindowFlags(Qt.CustomizeWindowHint) # 有边框但无标题栏和按钮,不能移动和拖动。 # window.setWindowFlags(Qt.WindowTitleHint) # 添加标题栏和一个不可用的关闭按钮 # window.setWindowFlags(Qt.WindowSystemMenuHint) # 添加系统目录和一个不可用的关闭按钮 # window.setWindowFlags(Qt.WindowMaximizeButtonHint) # 激活最大化,禁止最小化按钮和关闭按钮 # window.setWindowFlags(Qt.WindowMinimizeButtonHint) # 激活最小化,禁止最大化按钮和关闭按钮 # window.setWindowFlags(Qt.WindowMinMaxButtonsHint) # 激活最小化和最大化,禁止关闭按钮 # window.setWindowFlags(Qt.WindowCloseButtonHint) # 添加一个关闭按钮 # window.setWindowFlags(Qt.WindowContextHelpButtonHint) # 添加问号和不可用关闭按钮,同对话框 # window.setWindowFlags(Qt.WindowStaysOnTopHint) # 窗口始终处于顶层位置(QQ登录界面) # window.setWindowFlags(Qt.WindowStaysOnBottomHint) # 窗口始终处于底层位置 window.show() sys.exit(app.exec_())
- 案例:创建一个窗口
- 要求:
- 窗口无边框无标题栏
- 窗口半透明
- 自定义最小化、最大化、关闭按钮
- 支持拖拽用户区域移动窗口
- 代码1(面向过程的思路)
from PyQt5.Qt import * import sys class MyWidge(QWidget): def __init__(self): super().__init__() self.flag = False def mousePressEvent(self, a0: QMouseEvent) -> None: if a0.button() == Qt.LeftButton: self.flag = True self.mous_x = a0.x() self.mous_y = a0.y() def mouseMoveEvent(self, a0: QMouseEvent) -> None: if self.flag: move_x = a0.x() - self.mous_x move_y = a0.y() - self.mous_y self.move(self.x() + move_x, self.y() + move_y) def mouseReleaseEvent(self, a0: QMouseEvent) -> None: self.flag = False app = QApplication(sys.argv) window = MyWidge() window.resize(500, 500) window.setWindowTitle('窗口特定操作案例') # 设置窗口无边框、标题栏 window.setWindowFlags(Qt.FramelessWindowHint) # 设置窗口透明度 window.setWindowOpacity(0.8) # 添加最小、最大、关闭按钮 btn_li = ['关闭', '最大化', '最小化'] btn_w = 80 btn_h = 40 top_h = 1 btn_close = QPushButton(window) btn_close.resize(btn_w, btn_h) btn_close.setText('关闭') btn_max = QPushButton(window) btn_max.resize(btn_w, btn_h) btn_max.setText('最大化') btn_min = QPushButton(window) btn_min.resize(btn_w, btn_h) btn_min.setText('最小化') # 添加按钮移动方法 def btn_move(): btn_close_x = window.width() - btn_w btn_close.move(btn_close_x, top_h) btn_max_x = btn_close_x - btn_w btn_max.move(btn_max_x, top_h) btn_min_x = btn_max_x - btn_w btn_min.move(btn_min_x, top_h) # 调用移动方法,统一移动按钮 btn_move() # 添加最大化按钮槽函数,根据窗口状态设置按钮操作 def max_normal(): if window.isMaximized(): window.showNormal() btn_move() btn_max.setText('最大化') else: window.showMaximized() btn_move() btn_max.setText('恢复') # 给三个按钮的点击事件连接槽函数 btn_close.pressed.connect(window.close) btn_max.pressed.connect(max_normal) btn_min.pressed.connect(window.showMinimized) window.show() sys.exit(app.exec_())
- 代码2(面向对象的思路)
# 案例:创建一个窗口
# 要求:
# 窗口无边框无标题栏
# 窗口半透明
# 自定义最小化、最大化、关闭按钮
# 支持拖拽用户区域移动窗口
from PyQt5.Qt import *
import sys
class MyWidge(QWidget):
def __init__(self):
super().__init__()
self.flag = False
self.resize(500, 500)
self.setWindowTitle('窗口特定操作案例')
# 设置窗口无边框、标题栏
self.setWindowFlags(Qt.FramelessWindowHint)
# 设置窗口透明度
self.setWindowOpacity(0.8)
self.func_add()
def func_add(self):
self.add_widge()
self.btn_move()
self.btn_xinh()
def add_widge(self):
# 添加最小、最大、关闭按钮
self.btn_w = 80
self.btn_h = 40
self.top_h = 1
btn_close = QPushButton(self)
self.btn_close = btn_close
btn_close.resize(self.btn_w, self.btn_h)
btn_close.setText('关闭')
btn_max = QPushButton(self)
self.btn_max = btn_max
btn_max.resize(self.btn_w, self.btn_h)
btn_max.setText('最大化')
btn_min = QPushButton(self)
self.btn_min = btn_min
btn_min.resize(self.btn_w, self.btn_h)
btn_min.setText('最小化')
# 添加按钮移动方法
def btn_move(self):
btn_close_x = self.width() - self.btn_w
self.btn_close.move(btn_close_x, self.top_h)
btn_max_x = btn_close_x - self.btn_w
self.btn_max.move(btn_max_x, self.top_h)
btn_min_x = btn_max_x - self.btn_w
self.btn_min.move(btn_min_x, self.top_h)
def btn_xinh(self):
# 添加最大化按钮槽函数,根据窗口状态设置按钮操作
def max_normal():
if self.isMaximized():
self.showNormal()
self.btn_move()
self.btn_max.setText('最大化')
else:
self.showMaximized()
self.btn_move()
self.btn_max.setText('恢复')
# 给三个按钮的点击事件连接槽函数
self.btn_close.pressed.connect(self.close)
self.btn_max.pressed.connect(max_normal)
self.btn_min.pressed.connect(self.showMinimized)
def mousePressEvent(self, a0: QMouseEvent) -> None:
if a0.button() == Qt.LeftButton:
self.flag = True
self.mous_x = a0.x()
self.mous_y = a0.y()
def mouseMoveEvent(self, a0: QMouseEvent) -> None:
if self.flag:
move_x = a0.x() - self.mous_x
move_y = a0.y() - self.mous_y
self.move(self.x() + move_x, self.y() + move_y)
def mouseReleaseEvent(self, a0: QMouseEvent) -> None:
self.flag = False
app = QApplication(sys.argv)
window = MyWidge()
window.show()
sys.exit(app.exec_())