本篇介绍非模态“实时”(live)对话框。与上一篇讲的”apply型“非模态对话框的区别是,非模态“实时”(live)对话框没有任何按钮,且所做的任何改变会自动、即刻得到应用。
具体的运用请参见如下代码:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pn5GcuYmexMGezEXYwY3LcJDM2ITO2EzLcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.png)
import sys
from PyQt5.QtCore import Qt, pyqtSignal
from PyQt5.QtGui import QFont
from PyQt5.QtWidgets import *
#非模态对话框("live"型更新),字体选择组合框,自定义信号
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)
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)
self.setLayout(layout)
#直接连接对话框各子组件的信号
self.FontstyleComboBox.currentFontChanged.connect(self.accept)
self.FontEffectCheckBox.stateChanged.connect(self.accept)
self.FontSizeSpinBox.valueChanged.connect(self.accept)
self.setWindowTitle("字体")
def accept(self):#重新实现accept方法
#发射自定义信号
self.applySignal.emit(self.FontstyleComboBox.currentText(),
self.FontSizeSpinBox.value(),
self.FontEffectCheckBox.isChecked())
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_()