在上一篇里,实现的模态对话框的功能就是修改数据显示的格式,并进行提交后验证。在未应用该对话框之前,用户不能与对话框的父窗口以及父窗口的兄弟窗口就行交互,这样就保证了应用程序相关部分的状态不会在该对话框关闭之前改变。

可是如果我们想并不确定这一次的设置效果如何,需要多次调整设置的时候,模态对话框就显得不那么方便了。 这时候就可以利用非模态对话框,点击“应用”(apply)按钮来预览设置修改后的结果。

一般来说,模态对话框含有“接受”(accept)按钮和“拒绝”(reject)按钮;非模态对话框则含有“应用”(apply)按钮。

同样的目的,这次是非模态对话框。

import sys
from PyQt4.QtGui import *
from PyQt4.QtCore import *class MainWindow(QWidget):def __init__(self,parent=None):QWidget.__init__(self,parent)button  =   QPushButton("click me",self)button.clicked.connect(self.setNumberFormat)self.format     =   dict(thousandsseparator=',',decimalmarker='.',decimalplaces=2,rednegatives=True)def setNumberFormat(self):dialog  =   Intelligent(self.format,self)self.connect(dialog,SIGNAL('changed'),self.refreshTable)dialog.show()def refreshTable(self):print 1class Intelligent(QDialog):def __init__(self,format,parent=None):super(Intelligent,self).__init__(parent)self.setAttribute(Qt.WA_DeleteOnClose)  # ensure the dialog box can be detele while you click the 'close'punctuationRe   =   QRegExp(r"[ ,;:.]")thousandsLabel  =   QLabel("&Thousands separator")self.thousandsEdit  =   QLineEdit(format["thousandsseparator"])thousandsLabel.setBuddy(self.thousandsEdit)self.thousandsEdit.setMaxLength(1)  #the new function setMaxLengthself.thousandsEdit.setValidator(QRegExpValidator(punctuationRe, self))  #set the checkdecimalMarkerLabel  =   QLabel("Decimal &marker")self.decimalMarkerEdit  =   QLineEdit(format["decimalmarker"])decimalMarkerLabel.setBuddy(self.decimalMarkerEdit)self.decimalMarkerEdit.setMaxLength(1)self.decimalMarkerEdit.setValidator(QRegExpValidator(punctuationRe, self))self.decimalMarkerEdit.setInputMask("X")        # the new function ,set the input,and the X means anythingdecimalPlacesLabel =   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.Apply|QDialogButtonBox.Close|QDialogButtonBox.Ok)self.format =   formatlayout  =   QGridLayout()layout.addWidget(thousandsLabel,0,0)layout.addWidget(self.thousandsEdit,0,1)layout.addWidget(decimalMarkerLabel,1,0)layout.addWidget(self.decimalMarkerEdit,1,1)layout.addWidget(decimalPlacesLabel,2,0)layout.addWidget(self.decimalPlacesSpinBox,2,1)layout.addWidget(self.redNegativesCheckBox,3,0,1,2)layout.addWidget(buttonBox,4,0,1,2)self.setLayout(layout)self.connect(buttonBox.button(QDialogButtonBox.Apply),SIGNAL("clicked()"),self.apply)                                            self.connect(buttonBox,SIGNAL("rejected()"),self,SLOT("reject()"))self.connect(buttonBox,SIGNAL("accepted()"),self,SLOT("accept()"))self.setWindowTitle("Set Number Format (Mode;ess)")def apply(self):thousands   =   unicode(self.thousandsEdit.text())decimal =   unicode(self.decimalMarkerEdit.text())if thousands == decimal:QMessageBox.warning(self,"Format Error",    "The thousands separator and the decimal marker""must be different.")self.thousandsEdit.selectAll()self.thousandsEdit.setFocus()returnif len(decimal) == 0:QMessageBox.warning(self,"Format Error","the decimal marker may nor be empty.")self.decimalMarkerEdit.selectAll()self.decimalMarkerEdit.setFocus()returnself.format['thousandsseparator']   =   thousandsself.format['decimalmarker']    =   decimalself.format['decimalplaces']    =   \self.decimalPlacesSpinBox.value()self.format['rednegatives']   =   \self.redNegativesCheckBox.isChecked()self.emit(SIGNAL("changed"))app =   QApplication(sys.argv)
widget  =   MainWindow()
widget.show()
app.exec_()
框架讲解
这里的框架和上一篇差不多,不必过多讲解。
实现分析
1.这里有一句self.setAttribute(Qt.WA_DeleteOnClose) ,就是让用户点击“close”的时候关闭对话框而不是隐藏对话框。
2.self.decimalMarkerEdit.setInputMask("X")      设置输入掩码,推荐一篇博文,讲解得很详细。http://blog.csdn.net/xgbing/article/details/7776422
3.self.thousandsEdit.setValidator(QRegExpValidator(punctuationRe, self))    利用正则表达式验证。
4.self.format =   format;可以直接对对话框里面的格式字典进行改变而改变主窗口的格式字典。
与上一篇区别分析:
在这里结合预防验证和提交后验证,并利用正则表达式验证器和输入掩码进行预防式验证。效率得到提高。
能够在用户点击“apply‘得到预览效果,并和父窗口进行交互。

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

  1. PyQt4编程之模态与非模态对话框(一)

    模态对话框(Modal Dialogue Box,又叫做模式对话框),是指在用户想要对对话框以外的应用程序进行操作时,必须首先对该对话框进行响应.如单击[确定]或[取消]按钮等将该对话框关闭.---- ...

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. jQuery的attr方法处理checkbox的问题
  2. Oracle 字符集的查看和修改
  3. kudu接受kafka消息_Kafka入门详解
  4. python怎么读文件夹下的文件夹-python如何获取当前文件夹下所有文件名详解
  5. css实现让页面的footer始终位于底部
  6. python opencv 图像添加噪声_opencv+python同时加椒盐噪声和随机杂点噪声
  7. 蓝桥杯单片机基础学习00_1
  8. 宏定义#define
  9. python会内存泄漏吗_Python内存泄漏和内存溢出的解决方法
  10. 获取本地IP和端口号的指令
  11. java 3%3_Java 代码界 3% 的王者?看我是如何解错这 5 道题的
  12. 多功能pdf编辑器PDF Office Max for mac
  13. MATLAB 学习资料整理
  14. 常用Fragstats景观指数
  15. TOMCAT安装指南
  16. cmd与服务器文件传输,渗透技巧--通过cmd上传文件的N种方法
  17. 摆球控制程序PID算法
  18. postgresql用户和角色
  19. win10计算机内存,win10系统电脑怎么升级内存?win10系统升级内存的方法
  20. 盘盈的存货一般应作为什么处理

热门文章

  1. BSP(BUSINESS SERVER PAGES)完整主机名设置及实现
  2. CO07利润中心必输
  3. SM02 发送系统消息给所有Client用户
  4. 全民app使用率排行榜统计全了,微信再次位居榜首!
  5. 进位赛迪百强榜,雨花区的“高质量”发展底座有多坚实?
  6. 软件测试黑马程序员课后答案_软件测试课后习题答案
  7. php防止注入漏洞,php防止sql注入漏洞代码
  8. ios 字符串转数组_ES6中常用的数组操作-必须收藏
  9. linux 修改用户名 终端,如何修改Ubuntu终端用户名颜色修改为红色
  10. 计算机丢失qt4core.dll,qtcore4.;dll文件丢失。怎么办?