PyQt4 精彩实例分析* 实例18 可扩展对话框

46 篇文章 0 订阅

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

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

具体实现代码如下:


# -*- coding: utf-8 -*-
from PyQt4.QtGui import *
from PyQt4.QtCore import *
import sys

QTextCodec.setCodecForTr(QTextCodec.codecForName("utf8"))

class Extension(QDialog):
    def __init__(self,parent=None):
        super(Extension,self).__init__(parent)
        self.setWindowTitle(self.tr("可扩展对话框"))

        nameLabel=QLabel(self.tr("姓名:"))
        nameLineEdit=QLineEdit()
        sexLabel=QLabel(self.tr("性别:"))
        sexComboBox=QComboBox()
        sexComboBox.addItem(self.tr("男"))
        sexComboBox.addItem(self.tr("女"))

        okButton=QPushButton(self.tr("确定"))
        detailButton=QPushButton(self.tr("详细"))

        self.connect(detailButton,SIGNAL("clicked()"),self.slotExtension)

        btnBox=QDialogButtonBox(Qt.Vertical)
        btnBox.addButton(okButton,QDialogButtonBox.ActionRole)
        btnBox.addButton(detailButton,QDialogButtonBox.ActionRole)

        baseLayout=QGridLayout()
        baseLayout.addWidget(nameLabel,0,0)
        baseLayout.addWidget(nameLineEdit,0,1)
        baseLayout.addWidget(okButton,0,2)
        baseLayout.addWidget(sexLabel,1,0)
        baseLayout.addWidget(sexComboBox,1,1)
        baseLayout.addWidget(detailButton,1,2)

        ageLabel=QLabel(self.tr("年龄:"))
        ageLineEdit=QLineEdit("30")
        departmentLabel=QLabel(self.tr("部门:"))
        departmentComboBox=QComboBox()
        departmentComboBox.addItem(self.tr("部门一"))
        departmentComboBox.addItem(self.tr("部门二"))
        departmentComboBox.addItem(self.tr("部门三"))
        emailLabel=QLabel("email:")
        emailLineEdit=QLineEdit()

        self.detailWidget=QWidget()
        detailLayout=QGridLayout(self.detailWidget)
        detailLayout.addWidget(ageLabel,0,0)
        detailLayout.addWidget(ageLineEdit,0,1)
        detailLayout.addWidget(departmentLabel,1,0)
        detailLayout.addWidget(departmentComboBox,1,1)
        detailLayout.addWidget(emailLabel,2,0)
        detailLayout.addWidget(emailLineEdit,2,1)
        self.detailWidget.hide()
        
        mainLayout=QVBoxLayout()
        mainLayout.addLayout(baseLayout)
        mainLayout.addWidget(self.detailWidget)
        mainLayout.setSizeConstraint(QLayout.SetFixedSize)
        mainLayout.setSpacing(10)

        self.setLayout(mainLayout)
        
    def slotExtension(self):
        if self.detailWidget.isHidden():
            self.detailWidget.show()
        else:
            self.detailWidget.hide()

app=QApplication(sys.argv)
main=Extension()
main.show()
app.exec_()


第13-54行分别构建两部分窗体的内容。

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

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

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

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

mainLayout.setSizeConstraint(QLayout.SetFixedSize)

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

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

 

 

注:本文基本上是经过改编的《Linux窗口程序设计--Qt4精彩实例分析》一书的PyQt4 for windows版本

转自:http://blog.csdn.net/chumpklutz/article/details/6079243

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值