QDialog模态
d = QDialog()
d.setWindowTitle('对话框')
d.resize(300, 180)
'''弹出对话框的3种方法'''
d.exec() # 模态对话框,只有把Dialog窗口干掉才能和window主窗口交互
#d.open() # 非模态对话框,Dialog和window窗口可以同时互动
#d.show() # 非模态对话框,Dialog和window窗口可以同时互动
# 取消模态
d.setModal(False)
QMessageBox
设置不同模态的对话框
mb = QMessageBox(self) # 默认就是open(0:窗口级别模态 对话框
mb.setModal(False) # 取消模态
mb.exec() # 设置为应用程序级别模态窗口
设置内容
# 构造函数
# mb = QMessageBox(QMessageBox.Warning,'窗口标题','<h2>消息</h2>',QMessageBox.Discard | QMessageBox.Ok,self)
mb = QMessageBox(self)
# 设置标题
mb.setWindowTitle('窗口标题') # 设置对话框标题
# 设置文本模式
mb.setTextFormat(Qt.PlainText) # 默认为Qt.AutoText(自动识别)
# 设置主提示
mb.setText('这是主提示') # 设置主提示。可接受html代码
# 设置副提示
mb.setInformativeText('这是副提示')
# 设置详情信息
mb.setDetailedText('<h1>这是详情信息</h1>')
# 设置标准图标
mb.setIcon(QMessageBox.Information)
# 设置自定义图标
# mb.setIconPixmap(QPixmap('./resources/cat.jpg').scaled(1000,800)) #设置主提示
# 设置'勾选框'
mb.setCheckBox(QCheckBox('记住我', mb)) # 不支持html代码
mb.open()
自定义按钮
mb = QMessageBox(QMessageBox.Warning, '窗口标题', '<h2>消息</h2>',QMessageBox.Discard | QMessageBox.Ok, self)
# 设置标准按钮
# mb.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
# 添加自定义按钮
mb.addButton(QPushButton('自定义yes',mb),QMessageBox.YesRole)
btn = mb.addButton('自定义no',QMessageBox.NoRole)
# 移除按钮
# mb.removeButton(btn)
# 设置默认选择的按钮
mb.setDefaultButton(btn)
# 绑定特殊按钮
mb.setEscapeButton(btn) # 绑定Escape键
mb.open()
文本可复制
mb = QMessageBox(QMessageBox.Warning, '窗口标题', '<h2>消息</h2>', QMessageBox.Yes | QMessageBox.No, self)
# 设置交互权限。注意,仅对主副提示文本起作用(详情信息不起作用)
mb.setTextInteractionFlags(Qt.TextEditorInteraction) # 可以交互(选中复制粘贴...)
mb.open()
内存地址对比
mb = QMessageBox(QMessageBox.Warning, '窗口标题', '<h2>消息</h2>', QMessageBox.Discard | QMessageBox.Ok, self)
mb.setStandardButtons(QMessageBox.Yes | QMessageBox.No)
def func(btn):
# 内存地址对比
yes_btn = mb.button(QMessageBox.Yes)
no_btn = mb.button(QMessageBox.No)
print('点击了YES' if btn == yes_btn else '点击了NO')
# 角色对比
role = mb.buttonRole(btn)
print('点击了YES' if role == QMessageBox.YesRole else '点击了NO')
mb.buttonClicked.connect(func)
mb.open()
系统封装
PyQt5封装好的对话框
# QMessageBox.about(self, '标题', '提示')
# QMessageBox.aboutQt(self,'标题')
res = QMessageBox.question(self,'标题','提示',QMessageBox.Yes | QMessageBox.No,QMessageBox.No)
print(res) # 这是一个堵塞式弹出
QInputDialog对话框
输入框种类
QInputDialog.getInt(self, '标题', '提示内容', 100, step=5)
:QInputDialog.getDouble(self, '标题', '提示内容', 100.3, decimals=3)
QInputDialog.getText(self, '标题', '提示内容', echo=QLineEdit.Password)
QInputDialog.getMultiLineText(self, '标题', '提示内容', '默认值')
QInputDialog.getItem(self, '标题', '提示内容', ['wwe1', '1', '2', '3'], 2, True)
显示模式
# 设置对话框样式
i_d = QInputDialog(self,Qt.FramelessWindowHint) # 无边框
# 设置展示方式
i_d.setOption(QInputDialog.UseListViewForComboBoxItems) # 在一个多行文本框展示
# 设置枚举值
i_d.setComboBoxItems(['沙漠皇帝', '影流之主', '暮光之眼']) # 增加3个条目
i_d.show()
输入模式
i_d = QInputDialog(self)
# 改变界面控件的文字
i_d.setLabelText('输入名字') # 提示文字
i_d.setOkButtonText('林在超') # OK按钮的文字
i_d.setCancelButtonText('取消') # 取消按钮的文字
# 设置输入格式
i_d.setInputMode(QInputDialog.TextInput)
i_d.setDoubleRange(3.3, 10) # 设置取值范围(也可以setMaxmun,setMinimum)
i_d.setDoubleStep(2) # 设置步长
i_d.setDoubleDecimals(4) # 设置保留的小数位数
# 注意:只有设置 setInputMode(QInputDialog.TextInput)才能展示的内容
i_d.setComboBoxItems(['梁品策', '陈铿', '邓知凡']) # 增加下拉菜单条目
i_d.setComboBoxEditable(True) # 设置条目可以被编辑
i_d.show()
信号
-
文本:
i_d = QInputDialog(self) i_d.setInputMode(QInputDialog.TextInput) i_d.setComboBoxItems(['梁品策', '陈铿', '邓知凡']) i_d.textValueChanged.connect(lambda value: print('当前text值改变了,', value)) i_d.textValueSelected.connect(lambda value: print('最终选择了text值:', value)) i_d.show()
-
数值:
i_d = QInputDialog(self) i_d.setInputMode(QInputDialog.IntInput) i_d.intValueChanged.connect(lambda val: print('当前int值改变了,', val)) i_d.intValueSelected.connect(lambda val: print('最终选择了int值:', val)) i_d.setInputMode(QInputDialog.DoubleInput) i_d.doubleValueChanged.connect(lambda val: print('当前double值改变了', val)) i_d.doubleValueSelected.connect(lambda val: print('最终选择了double值:', val)) i_d.show()
QErrorMessage
模态
em = QErrorMessage(self)
em.exec()
非模态
em = QErrorMessage(self)
em.setWindowTitle('出错啦~~') #设置标题
#展示非模态对话框并设置提示文本
em.showMessage('错误消息_0')
em.showMessage('错误消息_1')
em.showMessage('错误消息_2')
em.showMessage('错误消息_3')
QProgressDialog
初识
pd = QProgressDialog('提示文本', '按钮文本', 1, 200, self) # 会自动弹,不用模态或非模态展示
# 参数可选,最小、最大值
# 设置窗口标题
pd.setWindowTitle('窗口标题')
# 设置最小等待时间
pd.setMinimumDuration(0) # 默认等待4秒进度条不满就弹出,但4秒之内进度条满了就不展示
# 设置是否自动关闭窗口
pd.setAutoClose(False) # 默认为True(自动关闭),真的能自动关闭的条件是下面的setAutoReset也为True
# 设置是否自动重置
pd.setAutoReset(False) # 默认True(自动重置),重置为 min-1
# 设置模态弹出
pd.open(lambda: print('窗口被取消了'))
进度条充能
pd = QProgressDialog(self)
# 设置
pd.setWindowTitle('标题') # 设置标题
pd.setLabelText('提示文本') # 设置提示文本
pd.setCancelButtonText('按钮文本') # 设置按钮文本
pd.setRange(0, 100) # 设置范围
pd.setValue(90) # 设置当前值
pd.show()
# 充能:每秒增加1%的需求
pd.setAutoReset(False) # 需关掉自动充重置,否则到达99后会重置为-1而不是100
timer = QTimer(pd)
def func(): # 但这样到了100就不能真的自己关闭窗口了,所以可以判定pd.value()+1>=100就行
if pd.value() >= pd.maximum() or pd.wasCanceled(): # 被按下取消按钮之后
timer.stop()
else:
pd.setValue(pd.value() + 0.01 * (pd.maximum() - pd.minimum()))
timer.timeout.connect(func)
timer.start(1000)
信号
btn = QPushButton('按钮', self)
pd = QProgressDialog(self)
pd.show()
# 点击取消按钮的信号
pd.canceled.connect(lambda: print('窗口被取消了'))
# 手动取消窗口
btn.clicked.connect(lambda: pd.cancel())
QFileDialog
静态方法
- 获取打开文件的文件名:
QFileDialog.getOpenFileName(self, '标题', './', 'All(*.*);;图片(*.png *.jpg);;py文件(*.py)', 'Python(*.py)')
- 获取多个打开文件的文件名:
QFileDialog.getOpenFileNames(self, '标题', './', 'All(*.*);;图片(*.png *.jpg);;py文件(*.py)', 'Python(*.py)')
- 获取打开文件的url:
QFileDialog.getOpenFileUrl(self, '标题', './', 'All(*.*);;图片(*.png *.jpg);;py文件(*.py)', 'Python(*.py)')
- 获取保存文件的文件名:
QFileDialog.getSaveFileName(self, '标题', './', 'All(*.*);;图片(*.png *.jpg);;py文件(*.py)', 'Python(*.py)')
- 获取文件夹的名称:
QFileDialog.getExistingDirectory(self, '标题', './')
- 获取文件夹的url:
QFileDialog.getExistingDirectoryUrl(self, '标题', QUrl('./'))
构造函数
fd = QFileDialog(self, '标题', '../', 'All(*.*);;图片(*.png *.jpg);;py文件(*.py)')
# 设置文件操作方式
fd.setAcceptMode(QFileDialog.AcceptSave) # 默认是QFileDialog.AcceptOpen(打开)
# 设置默认操作的文件类型
fd.setDefaultSuffix('txt')
# 设置选择文件类型(文件or文件夹)
fd.setFileMode(QFileDialog.Directory) # 选择文件夹
# 修改过滤器:会替代实例化fd时设置的过滤器(不是添加)
# fd.setNameFilter('图片(*.png *.jpg)') # 覆盖而非添加
fd.setNameFilters(['All(*.*)', '图片(*.png *.jpg)', 'py文件(*.py)'])
# 设置查看方式
fd.setViewMode(QFileDialog.Detail) # 默认为QFileDialog.List(列表形式)
# 设置按钮的文本
fd.setLabelText(QFileDialog.FileName, '文件') # 标题
fd.setLabelText(QFileDialog.Accept, '接受') # 确认按钮
fd.setLabelText(QFileDialog.Reject, '拒绝') # 取消按钮
fd.open()
信号
fd = QFileDialog(self, '标题', '../', 'All(*.*);;图片(*.png *.jpg);;py文件(*.py)')
# 文件改变的信号
fd.currentChanged.connect(lambda path: print('当前路径改变了:', path))
fd.currentUrlChanged.connect(lambda url: print('当前url改变了:', url))
# 进入目录时的信号
fd.directoryEntered.connect(lambda path: print('当前进入了目录::', path))
fd.directoryUrlEntered.connect(lambda url: print('当前进入了QUrl:', url))
# 过滤器被选中的信号
fd.filterSelected.connect(lambda filter: print('当前选择了过滤器:', filter))
# 文件被选中的信号
fd.setFileMode(QFileDialog.ExistingFiles)
fd.fileSelected.connect(lambda value: print('单个文件被选中:', value))
fd.filesSelected.connect(lambda value: print('多个文件被选中:', value))
fd.urlSelected.connect(lambda value: print('单个QUrl件被选中:', value))
fd.urlsSelected.connect(lambda value: print('多个QUrl被选中:', value))
fd.show()
QColorDialog
初识
btn = QPushButton('按钮', self)
btn.move(100, 100)
btn.clicked.connect(lambda: cd.open())
cd = QColorDialog(self)
cd.setWindowTitle('颜色选择器')
cd.setOptions(QColorDialog.NoButtons | QColorDialog.ShowAlphaChannel) # 去掉按钮步显示透明度选项
def func():
pal = QPalette()
pal.setColor(QPalette.Background, cd.currentColor()) # 背景实时显示为当前颜色
self.setPalette(pal)
cd.currentColorChanged.connect(func) # 当前颜色改变的信号
简单方法
btn = QPushButton('按钮', self)
btn.move(100, 100)
# 必须在定义cd之前调用的方法
QColorDialog.setCustomColor(1, QColor(100, 0, 0)) # 设置自定义区指定索引的颜色
QColorDialog.setStandardColor(2, QColor(0, 255, 0)) # 设置标准区指定索引的颜色
cd = QColorDialog(self)
cd.setWindowTitle('颜色选择器')
def func():
cd.show()
print(cd.customCount()) # 获取标准区颜色的个数(16个)
btn.clicked.connect(func)
不实例化cd的对话框
btn = QPushButton('按钮', self)
btn.move(100, 100)
def func():
color = QColorDialog.getColor(QColor(0, 0, 255), self, '选择颜色')
pal = QPalette()
pal.setColor(QPalette.Background, color)
self.setPalette(pal)
print(color)
btn.clicked.connect(func)
信号
cd = QColorDialog(self)
# cd.setOption(QColorDialog.NoButtons)
def select_color(color):
pal = QPalette()
pal.setColor(QPalette.ButtonText, color) # 枚举值代表对按钮操作颜色
btn.setPalette(pal) # 改变按钮文本颜色
cd.colorSelected.connect(select_color) # 按钮的颜色在选择完颜色后改变。
# cd.currentColorChanged.connect(select_color) #按钮的颜色是是改变。一般配合上面注释的cd.setOption(QColorDialog.NoButtons)使用
cd.show()
QFontDialog
初识
font = QFont()
font.setFamily('楷体')
font.setPointSize(12)
fd = QFontDialog(font, self) # 可传入字体对象,等效于 fd.setCurrentFont(font)
btn = QPushButton('按钮', self)
btn.move(10, 10)
def func():
if fd.exec(): # 当点击OK,exec()返回1。若关闭,则返回0
print('字体被选择:', fd.selectedFont().family()) # 获取最终选择的字体家族
else:
print('窗口被关闭,当前字体为:', fd.currentFont()) # 获取当前字体,不是最终的。
btn.clicked.connect(lambda: fd.open(func)) # 可以向open()传入函数,获取选择字体的信息。注意,函数无返回值
静态方法
btn = QPushButton('按钮', self)
btn.move(10, 10)
label = QLabel('沙漠皇帝-阿兹尔!', self)
label.move(100, 100)
font = QFont()
font.setFamily('楷体')
font.setPointSize(12)
# 静态方法
def font_func():
res = QFontDialog.getFont(font,self, '选择字体') #参数0和参数2可选
# 返回值为元组(选择的字体对象,是否点击了OK按钮)
if res[-1]:
label.setFont(res[0])
label.adjustSize() # 标签自动根据字体设置大小
btn.clicked.connect(font_func)
策略和信号
btn = QPushButton('按钮', self)
btn.move(10, 10)
btn.clicked.connect(lambda: fd.open())
label = QLabel('沙漠皇帝-阿兹尔!', self)
label.move(100, 100)
font = QFont()
font.setFamily('楷体')
font.setPointSize(12)
fd = QFontDialog(font, self)
# 设置对话框的显示策略
fd.setOption(QFontDialog.NonScalableFonts) # 不显示取消和OK按钮
# 判断显示策略是否生效
print(fd.testOption(QFontDialog.MonospacedFonts))
# 信号监听
def func(font):
label.setFont(font) # 根据选择的字体设置标签的字体
label.adjustSize()
fd.currentFontChanged.connect(func) # 字体改变的信号
QCalendarWidget
简单方法
cw = QCalendarWidget(self)
# 日期范围
cw.setMaximumDate(QDate(2021, 1, 1)) # 最大日期
cw.setMinimumDate(QDate(2018, 1, 1)) # 最小日期
cw.setDateRange(QDate(2018, 1, 1), QDate(2021, 1, 1)) # 日期范围(和上面等效.
# 设置日期
cw.setSelectedDate(QDate(2022, 1, 1)) # 选择日期
# 编辑日期
cw.setDateEditEnabled(True) # 默认为True(可编辑,直接打数字就可以)
# 设置接受延迟
cw.setDateEditAcceptDelay(2999) # 3秒钟之后才会变化
# 设置操作权限
cw.setSelectionMode(QCalendarWidget.NoSelection) # 用户不能选择日期,但可以对月历翻页查看。
# 获取日期
btn = QPushButton('按钮', self)
btn.move(300, 200)
def func():
print(cw.yearShown(), cw.monthShown(), cw.selectedDate()) # 年,月,选中的日期
btn.clicked.connect(func)
# 设置导航条
cw.setNavigationBarVisible(False) # 默认为True
# 设置一周的第一天为周几
cw.setFirstDayOfWeek(Qt.Sunday) # 默认为Qt.Monday(周一)
# 设置网格是否可见
cw.setGridVisible(True) # 默认为False
样式
# 控制水平头和垂直头的文本格式
tcf = QTextCharFormat()
tcf.setFontFamily('宋体') # 字体类型
tcf.setFontPointSize(12) # 字体大小
tcf.setFontUnderline(True) # 下划线
# 设置头部信息
cw = QCalendarWidget(self)
cw.setHeaderTextFormat(tcf)
# 设置水平头
cw.setHorizontalHeaderFormat(QCalendarWidget.NoHorizontalHeader) # 无显示
# 设置垂直头
cw.setVerticalHeaderFormat(QCalendarWidget.NoVerticalHeader) # 无显示
tcf_1 = QTextCharFormat()
tcf_1.setFontFamily('楷体')
tcf_1.setToolTip('是周5')
# 设置某一列的格式
cw.setWeekdayTextFormat(Qt.Friday, tcf_1)
# 设置特定日期的
cw.setDateTextFormat(QDate(2020, 3, 23), tcf_1)
切换显示
cw = QCalendarWidget(self)
btn = QPushButton('按钮', self)
btn.move(300, 200)
"""showToday # 显示当前的日期
showSelectedDate # 显示选中的日期
showNextYear # 展示下一年
showPreviousYear # 展示上一年
showNextMonth # 展示下个月
showPreviousMonth # 展示上个月
setCurrentPage(y,m) # 设置当前月份
"""
def func():
cw.setCurrentPage(2022, 3)
cw.setFocus()
btn.clicked.connect(func)
信号
cw = QCalendarWidget(self)
cw.clicked.connect(lambda: print('点击了日期'))
cw.selectionChanged.connect(lambda: print('选中的日期改变了:', cw.selectedDate())) # 无参数返回
cw.activated.connect(lambda date: print('确定了日期:', date))
cw.currentPageChanged.connect(lambda y, m: print('Page发生了改变', y, m))