一般的标准对话框是什么样子的呢?我们还是以word里的字体设置为例。一般都是通过菜单,工具栏,按钮等的响应而创建的对话框,而且对话框分为模态(modal)和非模态(modalless),对于标准对话框,当用户按下确定按钮,对话框消失,并且主窗口得到了用户确认的信息(设置的字体),按取消按钮,对话框消失,没有别的改变。
首先看一个modal对话框的例子:用户点击按钮,弹出字体设置对话框,用户点击确定,显示用户的选择,关闭窗口。
# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys
QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
class FontPropertiesDlg(QDialog):
def __init__(self,parent=None):
super(FontPropertiesDlg, self).__init__(parent)
FontStyleLabel = QLabel(u"中文字体:")
self.FontstyleComboBox = QComboBox()
self.FontstyleComboBox.addItems([u"宋体",u"黑体", u"仿宋", u"隶书", u"楷体"])
self.FontEffectCheckBox =QCheckBox(u"使用特效")
FontSizeLabel = QLabel(u"字体大小")
self.FontSizeSpinBox = QSpinBox()
self.FontSizeSpinBox.setRange(1, 90)
okButton = QPushButton(u"确定")
cancelButton = QPushButton(u"取消")
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, 0)
self.setLayout(layout)
self.connect(okButton,SIGNAL("clicked()"),self,SLOT("accept()"))
self.connect(cancelButton,SIGNAL("clicked()"),self,SLOT("reject()"))
self.setWindowTitle(u"字体")
class MainDialog(QDialog):
def __init__(self,parent=None):
super(MainDialog,self).__init__(parent)
self.FontPropertiesDlg=None
self.format=dict(fontstyle=u"宋体",fontsize=1,fonteffect=False)
FontButton1 = QPushButton(u"设置字体(模态)")
FontButton2 = QPushButton(u"设置字体(非模态)")
self.label = QLabel(u"默认选择")
layout = QGridLayout()
layout.addWidget(FontButton1,0,0)
layout.addWidget(FontButton2,0,1)
layout.addWidget(self.label)
self.setLayout(layout)
self.connect(FontButton1,SIGNAL("clicked()"),self.FontModalDialog) self.connect(FontButton2,SIGNAL("clicked()"),self.FontModalessDialog)
self.setWindowTitle(u"模态和非模态对话框")
self.updataData()
def updataData(self):
self.label.setText(u"选择的字体:%s<br>字体大小:%d<br>是否特效:%s" %(self.format["fontstyle"],self.format["fontsize"],self.format["fonteffect"]))
def FontModalDialog(self):
dialog = FontPropertiesDlg(self)
if dialog.exec_():
self.format["fontstyle"] = unicode(dialog.FontstyleComboBox.currentText())
self.format["fontsize"] = dialog.FontSizeSpinBox.value()
self.format["fonteffect"] = dialog.FontEffectCheckBox.isChecked()
self.updataData()
def FontModalessDialog(self):
pass
if __name__ == "__main__":
app=QApplication(sys.argv)
myqq=MainDialog()
myqq.show()
app.exec_()
结果如下:
其中右边的对话框是弹出的模态对话框,通过设置,确定以后可以在主对话框上显示出更新的内容。
其中“设置字体(非模态)“函数没有完成功能。
在模态对话框里面,我们是调用了dialog的exec_()函数,它能产生并显示对话框,并进入消息循环,此时就不能和主窗口进行交互了,只能点击确定或者取消,关闭此模态对话框才能继续。