天天看点

PyQt5 非模态对话框(live 型)

本篇介绍非模态“实时”(live)对话框。与上一篇讲的”apply型“非模态对话框的区别是,非模态“实时”(live)对话框没有任何按钮,且所做的任何改变会自动、即刻得到应用。

具体的运用请参见如下代码:

PyQt5 非模态对话框(live 型)

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_()