【转】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)切换按钮的实现。整个窗体可扩展的工作都是在此按钮所连接的槽函数中完成。

浙公网安备 33010602011771号