模态对话框(Modal Dialogue Box,又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应。如单击【确定】或【取消】按钮等将该对话框关闭。------------以上内容摘自360百科

对话框按照模态可以分为模态对话框和非模态对话框,按照智能程度又可以分为简易,标准和智能。大多数模态情况下,对话框包括简易和标准型的。

按照我的理解,简易型和标准型的其实基础架构差不多,只是标准型的“格式更标准”。所以先直接上一个标准型的例子来分析一下。

我们需要做好的对话框效果如下图所示。

就是在主界面点击某一个按钮,然后弹出该对话框对显示数据的格式进行设置。先上代码。

import sys
from PyQt4.QtCore import *
from PyQt4.QtGui import *
class Widget(QWidget):def __init__(self):QWidget.__init__(self)button  =   QPushButton(QIcon("web.png"),"click me",self)button.move(100,100)button.clicked.connect(self.setNumberFormat1)self.format =   dict(thousandsseparator=',',decimalmarker='.',decimalplaces=2,rednegatives=True)self.resize(200,300)def setNumberFormat1(self):      #the first Pointdialog  =   NumberFormatDlg(self.format,self)if dialog.exec_():self.format =   dialog.numberFormat()self.refreshTable()class NumberFormatDlg(QDialog):        #the second pointdef __init__(self,format,parent=None):super(NumberFormatDlg,self).__init__(parent)    thousandsLabel  =   QLabel("&Thousands seperator")    self.thousandsEdit  =   QLineEdit(format['thousandsseparator'])thousandsLabel.setBuddy(self.thousandsEdit)decimalMarkerLabel  =   QLabel("Decimal &marker")self.decimalMarkerEdit  =   QLineEdit(format["decimalmarker"])decimalMarkerLabel.setBuddy(self.decimalMarkerEdit)decimalPlacesLabel  =   QLabel("&Decimal places")self.decimalPlacesSpinBox   =   QSpinBox()     decimalPlacesLabel.setBuddy(self.decimalPlacesSpinBox)self.decimalPlacesSpinBox.setRange(0,6)         self.decimalPlacesSpinBox.setValue(format['decimalplaces'])     self.redNegativesCheckBox   =   QCheckBox("&Red negative numbers")    self.redNegativesCheckBox.setChecked(format['rednegatives'])  buttonBox   =   QDialogButtonBox(QDialogButtonBox.Ok|QDialogButtonBox.Cancel)self.format =   format.copy() # noticegrid    =   QGridLayout()grid.addWidget(thousandsLabel,0,0)grid.addWidget(self.thousandsEdit,0,1)grid.addWidget(decimalMarkerLabel,1,0)grid.addWidget(self.decimalMarkerEdit,1,1)grid.addWidget(decimalPlacesLabel,2,0)grid.addWidget(self.decimalPlacesSpinBox,2,1)grid.addWidget(self.redNegativesCheckBox,3,0,1,2)grid.addWidget(buttonBox,4,0,1,2)self.setLayout(grid)self.connect(buttonBox.button(QDialogButtonBox.Ok),SIGNAL("clicked()"),self,SLOT("accept()"))                                    self.connect(buttonBox,SIGNAL("rejected()"),self,SLOT("reject()"))  self.setWindowTitle("Set Number Format (Modal)")def numberFormat(self):return self.formatdef accept(self):        #override 'accept()' methodclass ThousandsError(Exception):        #inherit the class Exceptiondef __init__(self,message):Exception.__init__(self)self.message=messageclass DecimalError(Exception):def __init__(self,message):Exception.__init__(self)self.message=messagePunctuation =   frozenset(" ,;.")thousands   =   unicode(self.thousandsEdit.text())                                                                               decimal =   unicode(self.decimalMarkerEdit.text())try:if len(decimal) ==  0:raise DecimalError("The decimal marker may not be empty.")if len(thousands) > 1:raise ThousandsError("The thousands separator may only be empty or one character.")if len(decimal) > 1:raise DecimalError("The decimal marker must be one character")if thousands == decimal:raise ThousandsError("The thousands separator and the decimal marker must be different.")if thousands and thousands  not in Punctuation:     #"and not in"raise ThousandsError("The thousands separator must be a punctuation sumbol.")except ThousandsError, e:QMessageBox.warning(self,"Thousands Separator", unicode(e.message))       #QMessageBox's warning can create a new 'warning widget'self.thousandsEdit.selectAll()self.thousandsEdit.setFocus()returnexcept DecimalError, e:QMessageBox.warning(self,"D",unicode(e.message))self.decimalMarkerEdit.selectAll()self.decimalMarkerEdit.setFocus()returnself.format['thousandsseparator'] = thousandsself.format['decimalmarker'] = decimalself.format['decimalplaces'] =\self.decimalPlacesSpinBox.value()self.format["rednegatives"] =\self.redNegativesCheckBox.isChecked()   #the CheckBox has 'isChecked()' which can get the vaule of the CheckBoxQDialog.accept(self)app =   QApplication(sys.argv)
widget  =   Widget()
widget.show()app.exec_()
好,然后咱就按照套路分析一下。
框架讲解
框架就好比一篇文章的行文思路,是写这种代码所必须的。
第一部分:setNumberFormat1这个函数就是来弹出格式设置对话框,并对主窗口里面的数据格式更新。可以把它看成主窗口和对话框之间的桥梁。
第二部分:第二部分就是对话框这个类的实现了。
首先是init函数,设置控件,排出布局,连接按钮的信号和槽,前面的文章已经分析过类似的,所以也不需要多讲。
然后就是accept函数了,我们这里对它进行了重载。为什么要进行重载呢??进行重载一般是因为原来的函数不能实现我们想要的功能。
我们这里想要的功能是当我们点击“Ok”这个button的时候,对‘对话框’的各项的值进行验证,如果符合,则返回True给exec_(),否则回到对话框。而原来的accept函数只是简单地给exec_()返回一个True,除此之外什么都不干。(验证按验证的对象及其之间的关系分为窗口部件级验证和窗体级验证,按照时间先后分为预防式验证和提交后验证,这里明显是窗口部件级验证和提交后验证)
实现分析
1.代码实现部分需要注意的是"self.format =   format.copy()",在智能对话框里面,这一句是self.format = format.
用copy的原因是我们想传格式字典的副本,这样当改变对话框内的格式字典的时候不会影响原来的初始字典。
2.在accept的开头,我们创建了两个异常类,然后用try和except捕获异常。
下一篇结合非模态实例来讲解模态与非模态的区别。

PyQt4编程之模态与非模态对话框(一)相关推荐

  1. C++MFC基于对话框的编程——模态(非模态)对话框

    目录 一.添加MFC功能 二.创建基于MFC的应用程序框架 三.初识界面 四.上案例 1.拖控件button(两个) 2.改控件名字 2.1改名方法1 2.2改名方法2 3.添加两个新的对话框(Dia ...

  2. Qt下的模态和非模态对话框

    模态对话框(Modal Dialog)与非模态对话框(Modeless Dialog)的概念不是Qt所独有的,在各种不同的平台下都存在.又有叫法是称为模式对话框,无模式对话框等. 所谓模态对话框就是在 ...

  3. VC显示\关闭\销毁模态与非模态对话框技巧

    VC显示,关闭,销毁模态与非模态对话框技巧 显示对话框 显示模式对话框 CDialogDemo dlg; dlg.DoModal(); 显示非模式对话框 CDialogDemo *dlg=new CD ...

  4. JavaScrip高级应用:操作模态与非模态对话框

    JavaScrip高级应用:操作模态与非模态对话框  本文出自:http://www.computerworld.com.cn 作者: 甘冀平 (2002-01-29 20:41:38)  我们知道, ...

  5. win32模态与非模态对话框

    win32模态与非模态对话框 一.模态对话框与非模态对话框的区别 二.模拟实现模态窗口 1. 非阻塞的方式实现窗口的模态 2. 阻塞的方式实现窗口的模态 一.模态对话框与非模态对话框的区别 使用Dia ...

  6. Qt -- 19模态和非模态对话框

    什么是模态和非模态对话框 点不了其他的功能和界面.这种对话框就称为模态对话框.还有一些能够操作其他的窗口属于非模态对话框. 下面新建一个工程,新建好之后,在设计界面中搭建如下图所示窗体(1.在菜单项中 ...

  7. Win32_SDK_非模态对话框(非模态对话框窗口的销毁,模态与非模态对比,计算器项目练习)

    文章目录 1. 模态对话框与非模态对话框对比 2. 计算器项目练习模态与非模态对话框 3. 代码位置 1. 模态对话框与非模态对话框对比 模态对话框是通过DialogBox函数生成窗口,且函数的返回值 ...

  8. java 非模态_JavaScrip高级应用:操作模态与非模态对话框

    http://www.computerworld.com.cn 作者: 甘冀平 (2002-01-29 20:41:38) 我们知道,对话框一般分为两种类型:模态类型(modal)与非模态类型(mod ...

  9. 模态和非模态代码_我们如何使模态可用和可访问?

    模态和非模态代码 什么是模态? (What are modals?) A modal, or modal dialog, is an overlay window that opens on top ...

最新文章

  1. iOS 仿微信灵活添加标签
  2. 【译】Spring Boot 2.0 官方迁移指南
  3. SQL语句中 LIMIT与OFFSET
  4. Qt之debug和写log文件
  5. 【C++教程】01.基本概念
  6. [转]十个让你变成糟糕的程序员的行为
  7. android画数码管字体,如何为数字设置数码管LED字体
  8. 人人都是产品经理 读后感
  9. 会长大人的《从小麦到馒头的过程》
  10. TAT-QA: A Question Answering Benchmark on a Hybrid of Tabular and Textual Content in Finance
  11. WinCap数据包显示
  12. javascript:void(0)的作用
  13. 【周记】腾讯犀牛鸟「云开发」校园技术布道师养成计划
  14. 狂神——通过EasyExcel来操作Excel
  15. DPDKVPP关键技术文档总结
  16. 非谓语动词 + 情态动词学习笔记
  17. 如何理解工程测量中的各种误差
  18. python爬取大学生就业分析专科和本科的信息https://edu.jobui.com/major/(上)JSON的存储
  19. 知道当年为什么黑鹰3800hk受欢迎了,文案做得好谁不喜欢?
  20. 【Lua笔记】、Lua元表

热门文章

  1. 细说伟哥那些你不知道的神奇用途
  2. 不同服务器之间进行传输
  3. 会计记忆总结之三:会计等式与复式记账
  4. POPUP_GET_VALUES_DB_CHECKED’
  5. “天猫化”的考拉,还是考拉吗?
  6. 42岁的波司登, 强势回归是为何?
  7. 天平游码读数例题_电子天平偏载误差的检定与处理
  8. 中只有负下标里才能有零_门诊营销第一人武威名:诊所如何提升成交率之零风险承诺的运用?...
  9. oracle rac升级openssh,升级OpenSSH详细步骤
  10. 空间mysql升级_MySQL升级的3种方法