python3+PyQt5+Qt Designer实现堆叠窗口部件


Posted in Python onApril 20, 2018

本文是对《Python Qt GUI快速编程》的第9章的堆叠窗口例子Vehicle Rental用Python3+PyQt5+Qt Designer进行改写。

第一部分无借用Qt Designer,完全用代码实现。
第二部分则借用Qt Designer,快速实现。

第一部分:

import sys
from PyQt5.QtCore import (Qt)
from PyQt5.QtWidgets import (QApplication, QComboBox, QDialog,
 QDialogButtonBox, QFrame, QGridLayout, QHBoxLayout, QLabel,
 QSpinBox, QStackedWidget, QVBoxLayout, QWidget)

class VehicleRentalDlg(QDialog):

 def __init__(self, parent=None):
 super(VehicleRentalDlg, self).__init__(parent)

 vehicleLabel = QLabel("&Vehicle Type:")
 self.vehicleComboBox = QComboBox()
 vehicleLabel.setBuddy(self.vehicleComboBox)
 self.vehicleComboBox.addItems(["Car", "Van"])
 colorLabel = QLabel("Co&lor:")
 self.colorComboBox = QComboBox()
 colorLabel.setBuddy(self.colorComboBox)
 self.colorComboBox.addItems(["Black", "Blue", "Green", "Red",
  "Silver", "White", "Yellow"])
 seatsLabel = QLabel("&Seats:")
 self.seatsSpinBox = QSpinBox()
 seatsLabel.setBuddy(self.seatsSpinBox)
 self.seatsSpinBox.setRange(2, 12)
 self.seatsSpinBox.setValue(4)
 self.seatsSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
 weightLabel = QLabel("&Weight:")
 self.weightSpinBox = QSpinBox()
 weightLabel.setBuddy(self.weightSpinBox)
 self.weightSpinBox.setRange(1, 8)
 self.weightSpinBox.setValue(1)
 self.weightSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
 self.weightSpinBox.setSuffix(" tons")
 volumeLabel = QLabel("Volu&me")
 self.volumeSpinBox = QSpinBox()
 volumeLabel.setBuddy(self.volumeSpinBox)
 self.volumeSpinBox.setRange(4, 22)
 self.volumeSpinBox.setValue(10)
 self.volumeSpinBox.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
 self.volumeSpinBox.setSuffix(" cu m")
 mileageLabel = QLabel("Max. Mileage")
 self.mileageLabel = QLabel("1000 miles")
 self.mileageLabel.setAlignment(Qt.AlignRight|Qt.AlignVCenter)
 self.mileageLabel.setFrameStyle(QFrame.StyledPanel|QFrame.Sunken)
 self.buttonBox = QDialogButtonBox(QDialogButtonBox.Ok|
  QDialogButtonBox.Cancel)

 self.stackedWidget = QStackedWidget()
 carWidget = QWidget()
 carLayout = QGridLayout()
 carLayout.addWidget(colorLabel, 0, 0)
 carLayout.addWidget(self.colorComboBox, 0, 1)
 carLayout.addWidget(seatsLabel, 1, 0)
 carLayout.addWidget(self.seatsSpinBox, 1, 1)
 carWidget.setLayout(carLayout)
 self.stackedWidget.addWidget(carWidget)
 vanWidget = QWidget()
 vanLayout = QGridLayout()
 vanLayout.addWidget(weightLabel, 0, 0)
 vanLayout.addWidget(self.weightSpinBox, 0, 1)
 vanLayout.addWidget(volumeLabel, 1, 0)
 vanLayout.addWidget(self.volumeSpinBox, 1, 1)
 vanWidget.setLayout(vanLayout)
 self.stackedWidget.addWidget(vanWidget)

 topLayout = QHBoxLayout()
 topLayout.addWidget(vehicleLabel)
 topLayout.addWidget(self.vehicleComboBox)
 bottomLayout = QHBoxLayout()
 bottomLayout.addWidget(mileageLabel)
 bottomLayout.addWidget(self.mileageLabel)
 layout = QVBoxLayout()
 layout.addLayout(topLayout)
 layout.addWidget(self.stackedWidget)
 layout.addLayout(bottomLayout)
 layout.addWidget(self.buttonBox)
 self.setLayout(layout)


 self.buttonBox.accepted.connect(self.accept)
 self.buttonBox.rejected.connect(self.reject)
 self.vehicleComboBox.currentIndexChanged[str].connect(self.setWidgetStack)
 self.weightSpinBox.valueChanged[int].connect(self.weightChanged)

 self.setWindowTitle("Vehicle Rental")


 def setWidgetStack(self, text):
 if text == "Car":
 self.stackedWidget.setCurrentIndex(0)
 self.mileageLabel.setText("1000 miles")
 else:
 self.stackedWidget.setCurrentIndex(1)
 self.weightChanged(self.weightSpinBox.value())


 def weightChanged(self, amount):
 self.mileageLabel.setText("{0} miles".format(8000 / amount))


app = QApplication(sys.argv)
form = VehicleRentalDlg()
form.show()
app.exec_()

第二部分:
/home/yrd/eric_workspace/Vehicle/Ui_vehiclerentaldlg.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file '/home/yrd/eric_workspace/Vehicle/vehiclerentaldlg.ui'
#
# Created by: PyQt5 UI code generator 5.7
#
# WARNING! All changes made in this file will be lost!

from PyQt5 import QtCore, QtGui, QtWidgets

class Ui_VehicleRentalDlg(object):
 def setupUi(self, VehicleRentalDlg):
 VehicleRentalDlg.setObjectName("VehicleRentalDlg")
 VehicleRentalDlg.resize(206, 246)
 self.gridlayout = QtWidgets.QGridLayout(VehicleRentalDlg)
 self.gridlayout.setContentsMargins(9, 9, 9, 9)
 self.gridlayout.setSpacing(6)
 self.gridlayout.setObjectName("gridlayout")
 self.buttonBox = QtWidgets.QDialogButtonBox(VehicleRentalDlg)
 self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
 self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
 self.buttonBox.setObjectName("buttonBox")
 self.gridlayout.addWidget(self.buttonBox, 4, 0, 1, 1)
 spacerItem = QtWidgets.QSpacerItem(188, 16, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
 self.gridlayout.addItem(spacerItem, 3, 0, 1, 1)
 self.hboxlayout = QtWidgets.QHBoxLayout()
 self.hboxlayout.setContentsMargins(0, 0, 0, 0)
 self.hboxlayout.setSpacing(6)
 self.hboxlayout.setObjectName("hboxlayout")
 self.label_6 = QtWidgets.QLabel(VehicleRentalDlg)
 self.label_6.setObjectName("label_6")
 self.hboxlayout.addWidget(self.label_6)
 self.mileageLabel = QtWidgets.QLabel(VehicleRentalDlg)
 self.mileageLabel.setFrameShape(QtWidgets.QFrame.StyledPanel)
 self.mileageLabel.setFrameShadow(QtWidgets.QFrame.Sunken)
 self.mileageLabel.setAlignment(QtCore.Qt.AlignRight|QtCore.Qt.AlignTrailing|QtCore.Qt.AlignVCenter)
 self.mileageLabel.setObjectName("mileageLabel")
 self.hboxlayout.addWidget(self.mileageLabel)
 self.gridlayout.addLayout(self.hboxlayout, 2, 0, 1, 1)
 self.stackedWidget = QtWidgets.QStackedWidget(VehicleRentalDlg)
 self.stackedWidget.setObjectName("stackedWidget")
 self.page_2 = QtWidgets.QWidget()
 self.page_2.setObjectName("page_2")
 self.gridlayout1 = QtWidgets.QGridLayout(self.page_2)
 self.gridlayout1.setContentsMargins(9, 9, 9, 9)
 self.gridlayout1.setSpacing(6)
 self.gridlayout1.setObjectName("gridlayout1")
 self.colorComboBox = QtWidgets.QComboBox(self.page_2)
 self.colorComboBox.setObjectName("colorComboBox")
 self.colorComboBox.addItem("")
 self.colorComboBox.addItem("")
 self.colorComboBox.addItem("")
 self.colorComboBox.addItem("")
 self.colorComboBox.addItem("")
 self.colorComboBox.addItem("")
 self.colorComboBox.addItem("")
 self.gridlayout1.addWidget(self.colorComboBox, 0, 1, 1, 1)
 self.label_4 = QtWidgets.QLabel(self.page_2)
 self.label_4.setObjectName("label_4")
 self.gridlayout1.addWidget(self.label_4, 0, 0, 1, 1)
 self.label_5 = QtWidgets.QLabel(self.page_2)
 self.label_5.setObjectName("label_5")
 self.gridlayout1.addWidget(self.label_5, 1, 0, 1, 1)
 self.seatsSpinBox = QtWidgets.QSpinBox(self.page_2)
 self.seatsSpinBox.setAlignment(QtCore.Qt.AlignRight)
 self.seatsSpinBox.setMinimum(2)
 self.seatsSpinBox.setMaximum(12)
 self.seatsSpinBox.setProperty("value", 4)
 self.seatsSpinBox.setObjectName("seatsSpinBox")
 self.gridlayout1.addWidget(self.seatsSpinBox, 1, 1, 1, 1)
 self.stackedWidget.addWidget(self.page_2)
 self.page = QtWidgets.QWidget()
 self.page.setObjectName("page")
 self.gridlayout2 = QtWidgets.QGridLayout(self.page)
 self.gridlayout2.setContentsMargins(9, 9, 9, 9)
 self.gridlayout2.setSpacing(6)
 self.gridlayout2.setObjectName("gridlayout2")
 self.weightSpinBox = QtWidgets.QSpinBox(self.page)
 self.weightSpinBox.setAlignment(QtCore.Qt.AlignRight)
 self.weightSpinBox.setMinimum(1)
 self.weightSpinBox.setMaximum(8)
 self.weightSpinBox.setObjectName("weightSpinBox")
 self.gridlayout2.addWidget(self.weightSpinBox, 0, 1, 1, 1)
 self.label_3 = QtWidgets.QLabel(self.page)
 self.label_3.setObjectName("label_3")
 self.gridlayout2.addWidget(self.label_3, 1, 0, 1, 1)
 self.label_2 = QtWidgets.QLabel(self.page)
 self.label_2.setObjectName("label_2")
 self.gridlayout2.addWidget(self.label_2, 0, 0, 1, 1)
 self.volumeSpinBox = QtWidgets.QSpinBox(self.page)
 self.volumeSpinBox.setAlignment(QtCore.Qt.AlignRight)
 self.volumeSpinBox.setMinimum(4)
 self.volumeSpinBox.setMaximum(22)
 self.volumeSpinBox.setProperty("value", 10)
 self.volumeSpinBox.setObjectName("volumeSpinBox")
 self.gridlayout2.addWidget(self.volumeSpinBox, 1, 1, 1, 1)
 self.stackedWidget.addWidget(self.page)
 self.gridlayout.addWidget(self.stackedWidget, 1, 0, 1, 1)
 self.hboxlayout1 = QtWidgets.QHBoxLayout()
 self.hboxlayout1.setContentsMargins(0, 0, 0, 0)
 self.hboxlayout1.setSpacing(6)
 self.hboxlayout1.setObjectName("hboxlayout1")
 self.label = QtWidgets.QLabel(VehicleRentalDlg)
 self.label.setObjectName("label")
 self.hboxlayout1.addWidget(self.label)
 self.vehicleComboBox = QtWidgets.QComboBox(VehicleRentalDlg)
 self.vehicleComboBox.setObjectName("vehicleComboBox")
 self.vehicleComboBox.addItem("")
 self.vehicleComboBox.addItem("")
 self.hboxlayout1.addWidget(self.vehicleComboBox)
 self.gridlayout.addLayout(self.hboxlayout1, 0, 0, 1, 1)
 self.label_4.setBuddy(self.colorComboBox)
 self.label_5.setBuddy(self.seatsSpinBox)
 self.label_3.setBuddy(self.volumeSpinBox)
 self.label_2.setBuddy(self.seatsSpinBox)
 self.label.setBuddy(self.vehicleComboBox)

 self.retranslateUi(VehicleRentalDlg)
 self.stackedWidget.setCurrentIndex(0)
 self.vehicleComboBox.currentIndexChanged['int'].connect(self.stackedWidget.setCurrentIndex)
 self.buttonBox.accepted.connect(VehicleRentalDlg.accept)
 self.buttonBox.rejected.connect(VehicleRentalDlg.reject)
 QtCore.QMetaObject.connectSlotsByName(VehicleRentalDlg)

 def retranslateUi(self, VehicleRentalDlg):
 _translate = QtCore.QCoreApplication.translate
 VehicleRentalDlg.setWindowTitle(_translate("VehicleRentalDlg", "Vehicle Rental"))
 self.label_6.setText(_translate("VehicleRentalDlg", "Max. Mileage:"))
 self.mileageLabel.setText(_translate("VehicleRentalDlg", "1000 miles"))
 self.colorComboBox.setItemText(0, _translate("VehicleRentalDlg", "Black"))
 self.colorComboBox.setItemText(1, _translate("VehicleRentalDlg", "Blue"))
 self.colorComboBox.setItemText(2, _translate("VehicleRentalDlg", "Green"))
 self.colorComboBox.setItemText(3, _translate("VehicleRentalDlg", "Red"))
 self.colorComboBox.setItemText(4, _translate("VehicleRentalDlg", "Silver"))
 self.colorComboBox.setItemText(5, _translate("VehicleRentalDlg", "White"))
 self.colorComboBox.setItemText(6, _translate("VehicleRentalDlg", "Yellow"))
 self.label_4.setText(_translate("VehicleRentalDlg", "Co&lor:"))
 self.label_5.setText(_translate("VehicleRentalDlg", "&Seats:"))
 self.weightSpinBox.setSuffix(_translate("VehicleRentalDlg", " tons"))
 self.label_3.setText(_translate("VehicleRentalDlg", "Volu&me:"))
 self.label_2.setText(_translate("VehicleRentalDlg", "&Weight:"))
 self.volumeSpinBox.setSuffix(_translate("VehicleRentalDlg", " cu m"))
 self.label.setText(_translate("VehicleRentalDlg", "&Vehicle Type:"))
 self.vehicleComboBox.setItemText(0, _translate("VehicleRentalDlg", "Car"))
 self.vehicleComboBox.setItemText(1, _translate("VehicleRentalDlg", "Van"))

/home/yrd/eric_workspace/Vehicle/vehiclerentaldlg.py

# -*- coding: utf-8 -*-

"""
Module implementing VehicleRentalDlg.
"""
import sys
from PyQt5.QtCore import pyqtSlot
from PyQt5.QtWidgets import QDialog,QApplication

from Ui_vehiclerentaldlg import Ui_VehicleRentalDlg


class VehicleRentalDlg(QDialog, Ui_VehicleRentalDlg):
 """
 Class documentation goes here.
 """
 def __init__(self, parent=None):
 """
 Constructor

 @param parent reference to the parent widget
 @type QWidget
 """
 super(VehicleRentalDlg, self).__init__(parent)
 self.setupUi(self)
 self.vehicleComboBox.setFocus()

 @pyqtSlot(int)
 def on_weightSpinBox_valueChanged(self, amount):
 self.mileageLabel.setText("{0} miles".format(8000 / amount))


 @pyqtSlot(str)
 def on_vehicleComboBox_currentIndexChanged(self, text):
 if text == "Car":
 self.mileageLabel.setText("1000 miles")
 else:
 self.on_weightSpinBox_valueChanged(
 self.weightSpinBox.value()) 

if __name__ == "__main__":
 app = QApplication(sys.argv)
 form = VehicleRentalDlg() 
 form.show()
 app.exec_()

运行结果:

python3+PyQt5+Qt Designer实现堆叠窗口部件

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python 解析XML python模块xml.dom解析xml实例代码
Feb 07 Python
Python使用正则匹配实现抓图代码分享
Apr 02 Python
Flask框架的学习指南之用户登录管理
Nov 20 Python
python 调用win32pai 操作cmd的方法
May 28 Python
Python3中简单的文件操作及两个简单小实例分享
Jun 18 Python
解决python 自动安装缺少模块的问题
Oct 22 Python
深入理解Python异常处理的哲学
Feb 01 Python
浅谈Python3中strip()、lstrip()、rstrip()用法详解
Apr 29 Python
Python迷宫生成和迷宫破解算法实例
Dec 24 Python
numpy库ndarray多维数组的维度变换方法(reshape、resize、swapaxes、flatten)
Apr 28 Python
python+selenium 简易地疫情信息自动打卡签到功能的实现代码
Aug 22 Python
在Python 中将类对象序列化为JSON
Apr 06 Python
python3 pandas 读取MySQL数据和插入的实例
Apr 20 #Python
PyQt5每天必学之事件与信号
Apr 20 #Python
pandas groupby 分组取每组的前几行记录方法
Apr 20 #Python
基于pandas数据样本行列选取的方法
Apr 20 #Python
pandas实现选取特定索引的行
Apr 20 #Python
PyQT实现多窗口切换
Apr 20 #Python
使用实现pandas读取csv文件指定的前几行
Apr 20 #Python
You might like
如何使用动态共享对象的模式来安装PHP
2006/10/09 PHP
利用PHP动态生成VRML网页
2006/10/09 PHP
php中文字符截取防乱码
2008/03/28 PHP
php 各种应用乱码问题的解决方法
2010/05/09 PHP
批量去除PHP文件中bom的PHP代码
2012/03/13 PHP
PHP实现获取url地址中顶级域名的方法示例
2019/06/05 PHP
Jquery练习之表单验证实现代码
2010/12/14 Javascript
ie7+背景透明文字不透明超级简单的实现方法
2014/01/17 Javascript
解决html按钮切换绑定不同函数后点击时执行多次函数问题
2014/05/14 Javascript
javascript实现淡蓝色的鼠标拖动选择框实例
2015/05/09 Javascript
AngularJS基础 ng-switch 指令简单示例
2016/08/03 Javascript
BootStrap下拉菜单和滚动监听插件实现代码
2016/09/26 Javascript
详解jQuery简单的表格应用
2016/12/16 Javascript
vue中v-model的应用及使用详解
2018/06/27 Javascript
vue控制多行文字展开收起的实现示例
2019/10/11 Javascript
茶余饭后聊聊Vue3.0响应式数据那些事儿
2019/10/30 Javascript
vue中keep-alive,include的缓存问题
2019/11/26 Javascript
python使用KNN算法手写体识别
2018/02/01 Python
在Python中过滤Windows文件名中的非法字符方法
2019/06/10 Python
Django项目中实现使用qq第三方登录功能
2019/08/13 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
Python super()函数使用及多重继承
2020/05/06 Python
Notino法国:购买香水和化妆品
2019/04/15 全球购物
Jones New York官网:美国女装品牌,受白领女性欢迎
2019/11/26 全球购物
公职人员索取回扣检举信
2014/04/04 职场文书
2014年党的群众路线学习心得体会
2014/11/05 职场文书
2015元旦节寄语
2014/12/08 职场文书
2015年个人实习工作总结
2014/12/12 职场文书
2015元旦主持词开场白和结束语
2014/12/14 职场文书
六一文艺汇演开幕词
2015/01/29 职场文书
建国大业观后感600字
2015/06/01 职场文书
王亚平太空授课观后感
2015/06/12 职场文书
《自己的花是让别人看的》教学反思
2016/02/19 职场文书
股东合作协议书模板2篇
2019/11/05 职场文书
分位数回归模型quantile regeression应用详解及示例教程
2021/11/02 Python
Python批量解压&压缩文件夹的示例代码
2022/04/04 Python