pyQt不同窗体间的值传递(一)——对话框关闭时返回值给主窗口

    在写pyQt时,经常会遇到输入或选择多个参数的问题,把它写到一个窗体中,会显得主窗体很臃肿。所以一般是添加一个按钮,调用对话框,将这些参数选择放入弹出的对话框中,关闭对话框时将参数值返回给主窗体。


    pyQT中提供一些标准的对话框类,可以用于输入数据,修改数据,更改应用的设置等等,如常见的QFileDialog、QInputDialog、QColorDialog、QFontDialog等。具体的使用例子可以参考:
http://www.cppblog.com/mirguest/archive/2012/02/12/165386.html


另外,也可以自定义对话框,通过在自定义对话框类中实现静态函数来传值。先来个例子:

自定义对话框类如下:
 
    
# -*- coding: utf-8 -*-
"""
Created on Wed Jul 15 16:18:59 2015
 
@author: Administrator
"""
from PyQt4.QtCore import *
from PyQt4.QtGui import *
 
class DateDialog(QDialog):
def __init__(self, parent = None):
super(DateDialog, self).__init__(parent)
 
layout = QVBoxLayout(self)
 
# nice widget for editing the date
self.datetime = QDateTimeEdit(self)
self.datetime.setCalendarPopup(True)
self.datetime.setDateTime(QDateTime.currentDateTime())
layout.addWidget(self.datetime)
 
# OK and Cancel buttons
buttons = QDialogButtonBox(
QDialogButtonBox.Ok | QDialogButtonBox.Cancel,
Qt.Horizontal, self)
buttons.accepted.connect(self.accept)
buttons.rejected.connect(self.reject)
layout.addWidget(buttons)
 
# get current date and time from the dialog
def dateTime(self):
return self.datetime.dateTime()
 
# static method to create the dialog and return (date, time, accepted)
@staticmethod
def getDateTime(parent = None):
dialog = DateDialog(parent)
result = dialog.exec_()
date = dialog.dateTime()
return (date.date(), date.time(), result == QDialog.Accepted)

主要注意几点:
1、使用两个button(ok和cancel)分别连接accept()和reject()槽函数。
2、实现一个静态函数,将参数通过该函数传出。
3、在静态函数中实例化该类,并调用.exec_()函数来显示执行这个对话框。
4、通过.exec_()的返回值来判断用户点的是ok还是cancel按钮,进而做出下一步判断。

在主窗口中调用静态函数方法,就可以得到传递的参数值,代码如下:
 
     
date, time, ok = DateDialog.getDateTime()
第二种方法,直接在主窗口程序中实例化该对话框,然后调用该对话框的函数来获取返回值。同样对于上面的DateDialog,在主程序中的代码如下:
 
     
dialog = DateDialog(self)
result = dialog.exec_()
date = dialog.dateTime()
print date.date(),date.time(),result
dialog.destroy()
或者,根据对话框返回点击确认还是取消来进行下一步操作。
 
     
dialog = DateDialog(self)
if dialog.exec_():
date = dialog.dateTime()
print date.date(),date.time(),result
dialog.destroy()

可以看出,这两种方法的本质是一样的,都是实例化对话框类,调用该对话框的函数获取需要的值,而使用静态函数方法只是将这些过程进行的封装。

你可能感兴趣的:(Python)