【转】PyQt4 精彩实例分析 实例 18 可扩展对话框

可扩展对话框一般用于使用用户有区分的场合。通常情况下,只出现基本的对话窗体,当有高级用户使用,或
需要更多信息时,通过某种方式的切换显示完整的对话窗体,切换的工作通常由一个按钮来实现。本实例即实
现了一个简单的填写资料的例子,通常情况下,只需填写姓名和性别,在有特殊需要时,还需填写更多信息则
切换至完整对话窗体。如下图所示。

 

 

 

 

 

 

 

 

当单击“详细(Detail)”按钮时,对话框扩展,显示其他更详细的信息,再次单击“详细”按钮,扩展窗口又重新隐藏。

具体实现代码如下:

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 
 4 from PyQt4.QtGui import *
 5 from PyQt4.QtCore import *
 6 import sys
 7 
 8 QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))
 9 
10 class Extension(QDialog):
11     def __init__(self, parent=None):
12         super(Extension, self).__init__(parent)
13 
14         self.setWindowTitle("Extension Dialog")
15 
16         self.label_name = QLabel(self.tr("Name:"))
17         self.label_sex = QLabel(self.tr("Sex:"))
18         self.lineEdit_name = QLineEdit()
19         self.comboBox_sex = QComboBox()
20         self.comboBox_sex.addItem(self.tr("M"))
21         self.comboBox_sex.addItem(self.tr("F"))
22 
23         self.btn_ok = QPushButton(self.tr("OK"))
24         self.btn_detail = QPushButton(self.tr("Detail"))
25 
26         self.btn_box = QDialogButtonBox(Qt.Vertical)
27         self.btn_box.addButton(self.btn_ok, QDialogButtonBox.ActionRole)
28         self.btn_box.addButton(self.btn_detail, QDialogButtonBox.ActionRole)
29 
30         self.label_age = QLabel(self.tr("Age:"))
31         self.lineEdit_age = QLineEdit("30")
32         self.label_department = QLabel(self.tr("Department:"))
33         self.conboBox_department = QComboBox()
34         self.conboBox_department.addItem(self.tr("department 0"))
35         self.conboBox_department.addItem(self.tr("department 1"))
36         self.conboBox_department.addItem(self.tr("department 2"))
37         self.label_email = QLabel("Email:")
38         self.lineEdit_email = QLineEdit()
39 
40         self.detailWidget = QWidget()
41         self.detailWidget.hide()
42 
43         self.Layout()
44         self.ConnectSignalSlot()
45 
46     def Layout(self):
47         baseLayout = QGridLayout()
48         baseLayout.addWidget(self.label_name, 0, 0)
49         baseLayout.addWidget(self.lineEdit_name, 0, 1)
50         baseLayout.addWidget(self.btn_ok, 0, 2)
51         baseLayout.addWidget(self.label_sex, 1, 0)
52         baseLayout.addWidget(self.comboBox_sex, 1, 1)
53         baseLayout.addWidget(self.btn_detail, 1, 2)
54 
55         detailLayout = QGridLayout(self.detailWidget)
56         detailLayout.addWidget(self.label_age, 0, 0)
57         detailLayout.addWidget(self.lineEdit_age, 0, 1)
58         detailLayout.addWidget(self.label_department, 1, 0)
59         detailLayout.addWidget(self.conboBox_department, 1, 1)
60         detailLayout.addWidget(self.label_email, 2, 0)
61         detailLayout.addWidget(self.lineEdit_email, 2, 1)
62 
63         mainLayout = QVBoxLayout()
64         mainLayout.addLayout(baseLayout)
65         mainLayout.addWidget(self.detailWidget)
66         mainLayout.setSizeConstraint(QLayout.SetFixedSize)
67         mainLayout.setSpacing(10)
68 
69         self.setLayout(mainLayout)
70 
71     def ConnectSignalSlot(self):
72         self.connect(self.btn_detail, SIGNAL("clicked()"), self.soltExtension)
73 
74     def soltExtension(self):
75         if self.detailWidget.isHidden():
76             self.detailWidget.show()
77         else:
78             self.detailWidget.hide()
79 
80 def main():
81     app = QApplication(sys.argv)
82     main = Extension()
83     main.show()
84     app.exec_()
85     
86 if __name__ == '__main__':
87     main()

第 16-41 行分别构建两部分窗体的内容。

第 47-69 行对整个对话框进行布局,其中,调用 setSizeConstraint(QLayout.SetFixedSize)设置窗
体的大小固定,不能经过拖动改变大小,否则当再次单击“详细”按钮时,对话框不能恢复到初始状态。

slotExtension()函数完成窗体扩展切换的工作,在用户单击 detailButton 时调用此函数,首先检测
detailWidget 窗体处于何种状态。若此时是隐藏状态,则应用 show()函数显示 detailWidget 窗体,否
则调用 hide()隐藏 detailWidget 窗体。

通过本实例的分析,可了解扩展对话框的基本实现方法,其中最关键的部分有以下两点:

1)在整个对话框的构造函数中调用。

mainLayout.setSizeConstraint(QLayout.SetFixedSize)

这个设置保证了对话框的尺寸保持相对固定,始终是各控件组合的默认尺寸,在扩展部分显示时,对话框尺寸
根据需显示的控件进行扩展调整,而在扩展部分隐藏时,对话框尺寸又恢复至初始状态。

2)切换按钮的实现。整个窗体可扩展的工作都是在此按钮所连接的槽函数中完成。

posted @ 2014-11-19 09:10  jakey.chen  阅读(439)  评论(0)    收藏  举报