如果希望用户可以重复更改对话框中的参数并能马上看到修改结果,那么就要使用非模态对话框,这样用户就可以按照他们喜欢的方式来持续不断地修改数据并验证修改的结果了。
非模态对话框对话框通常都有一个应用(Apply)按钮和一个关闭(close)按钮。用户一旦点击了应用按钮,改变就会发生,对话框也不会关闭,可以连续点击应用按钮,直到关闭了对话框。
具体的运用请参见如下代码。
代码语言:javascript复制import sys
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import *
#非模态对话框("Apply"型更新),字体选择组合框,自定义信号
class FontPropertiesDlg(QDialog):
applySignal = pyqtSignal(str,int,bool)#自定义信号
def __init__(self,parent=None):
super().__init__(parent)
#print(self.parent().windowTitle())
FontStyleLabel = QLabel("字体:")
self.FontstyleComboBox = QFontComboBox()#字体选择组合框
self.FontEffectCheckBox =QCheckBox("使用特效")
FontSizeLabel = QLabel("字体大小")
self.FontSizeSpinBox = QSpinBox()
self.FontSizeSpinBox.setRange(6, 36)
self.FontSizeSpinBox.setValue(12)
#这次没有采用QButtonBox
okButton = QPushButton("应用")
cancelButton = QPushButton("关闭")
buttonLayout = QHBoxLayout()
buttonLayout.addStretch()
buttonLayout.addWidget(okButton)
buttonLayout.addWidget(cancelButton)
layout = QGridLayout()
layout.addWidget(FontStyleLabel, 0, 0)
layout.addWidget(self.FontstyleComboBox, 0, 1)
layout.addWidget(FontSizeLabel, 1, 0)
layout.addWidget(self.FontSizeSpinBox, 1, 1)
layout.addWidget(self.FontEffectCheckBox,1,2)
layout.addLayout(buttonLayout, 2, 2)
self.setLayout(layout)
okButton.clicked.connect(self.accept)
cancelButton.clicked.connect(self.reject)
self.setWindowTitle("字体")
def accept(self):#重新实现accept方法
#发射自定义信号
self.applySignal.emit(self.FontstyleComboBox.currentText(),
self.FontSizeSpinBox.value(),
self.FontEffectCheckBox.isChecked())
#也可以 调用 self.parent()得到父窗口的句柄,从而向父窗口传递值
#和控制父窗口的行为,但是耦合度过高,不推荐
#print(self.parent())
#print(self.topLevelWidget())#Pyqt5中此方法没有了?
#self.hide()#应用后隐藏,为了可以连续点应用按钮,一般不隐藏
class MainDialog(QDialog):
def __init__(self,parent=None):
super(MainDialog,self).__init__(parent)
self.FontPropertiesDlg=None
self.format=dict(fontstyle="宋体",fontsize=10,fonteffect=False)
FontButton = QPushButton("设置字体(非模态)")
self.label = QLabel("默认选择")
layout = QGridLayout()
layout.addWidget(FontButton,0,0)
layout.addWidget(self.label)
self.setLayout(layout)
FontButton.clicked.connect(self.FontModalessDialog)
self.setWindowTitle("非模态对话框")
#self.setFixedSize(self.width(), 100)#固定窗口大小
self.labelFont = QFont(self.format["fontstyle"],self.format["fontsize"])
self.updateLabel()
self.modalessDialog = None#初始值设为空,
def updateLabel(self):
self.label.setFont(self.labelFont)
self.label.setText("选择的字体:%s 字体大小:%d 是否特效:%s" %(self.format["fontstyle"],self.format["fontsize"],self.format["fonteffect"]))
def updateUI(self,fontstyle,fontsize,fonteffect):#For modaless dialog
self.format["fontstyle"] = fontstyle
self.format["fontsize"] = fontsize
self.format["fonteffect"] = fonteffect
self.labelFont = QFont(fontstyle,fontsize)
self.updateLabel()
def FontModalessDialog(self):
#仅第一次调用的时候创建对话框,所有可保留对话框的各项设置
if self.modalessDialog is None:
self.modalessDialog = FontPropertiesDlg(self)
#连接从对话框接发出的自定义信号
self.modalessDialog.applySignal.connect(self.updateUI)
self.modalessDialog.show()#非模态地显示对话框
app = QApplication(sys.argv)
font= MainDialog()
font.show()
app.exec_()