Python桌面开发pyqt5—QDialog及子类

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))
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值