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爬虫
Dec 25 Python
Python对list列表结构中的值进行去重的方法总结
May 07 Python
对比Python中__getattr__和 __getattribute__获取属性的用法
Jun 21 Python
python daemon守护进程实现
Aug 27 Python
详解Python3操作Mongodb简明易懂教程
May 25 Python
Python实现的三层BP神经网络算法示例
Feb 07 Python
python config文件的读写操作示例
Sep 27 Python
Python 实现顺序高斯消元法示例
Dec 09 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
May 22 Python
解决tensorflow读取本地MNITS_data失败的原因
Jun 22 Python
Python3爬虫中Ajax的用法
Jul 10 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 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横向重复区域显示二法
2008/09/25 PHP
PHP之短标签开启设置
2013/06/17 PHP
php实现给图片加灰色半透明效果的方法
2014/10/20 PHP
php简单实现sql防注入的方法
2016/04/22 PHP
zen_cart实现支付前生成订单的方法
2016/05/06 PHP
PHP解析url并得到url参数方法总结
2018/10/11 PHP
javascript 表单规则集合对象
2009/07/21 Javascript
javascript 伪数组实现方法
2010/10/11 Javascript
深入理解JavaScript系列(11) 执行上下文(Execution Contexts)
2012/01/15 Javascript
javascript判断是否按回车键并解决浏览器之间的差异
2014/05/13 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
多种js图片预加载实现方式分享
2016/02/19 Javascript
jQuery之简单的表单验证实例
2016/07/07 Javascript
Vue Spa切换页面时更改标题的实例代码
2017/07/15 Javascript
nuxt.js中间件实现拦截权限判断的方法
2018/11/21 Javascript
Vue.js组件高级特性实例详解
2018/12/24 Javascript
ES6 Proxy实现Vue的变化检测问题
2019/06/11 Javascript
Vue2.4+新增属性.sync、$attrs、$listeners的具体使用
2020/03/08 Javascript
vue-drag-chart 拖动/缩放图表组件的实例代码
2020/04/10 Javascript
简单了解JavaScript弹窗实现代码
2020/05/07 Javascript
在vue-cli3.0 中使用预处理器 (Sass/Less/Stylus) 配置全局变量操作
2020/08/10 Javascript
在Python中调用ggplot的三种方法
2015/04/08 Python
Python中__init__.py文件的作用详解
2016/09/18 Python
Python中__slots__属性介绍与基本使用方法
2018/09/05 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
pyinstaller打包单文件时--uac-admin选项不起作用怎么办
2020/04/15 Python
VIVOBAREFOOT赤脚鞋:让您的脚做自然的事情
2017/06/01 全球购物
新春联欢会主持词
2014/03/24 职场文书
高等教育专业自荐信范文
2014/03/26 职场文书
高三毕业典礼演讲稿
2014/05/13 职场文书
小学毕业典礼演讲稿
2014/09/09 职场文书
先进个人材料怎么写
2014/12/30 职场文书
四大名著读书笔记
2015/06/25 职场文书
驻村工作简报
2015/07/20 职场文书
多表查询、事务、DCL
2021/04/05 MySQL