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中unittest模块做UT(单元测试)使用实例
Jun 12 Python
Python列表推导式与生成器表达式用法示例
Feb 08 Python
对python中字典keys,values,items的使用详解
Feb 03 Python
Scrapy框架爬取西刺代理网免费高匿代理的实现代码
Feb 22 Python
python隐藏终端执行cmd命令的方法
Jun 24 Python
django 中QuerySet特性功能详解
Jul 25 Python
python 读取数据库并绘图的实例
Dec 03 Python
python实现异常信息堆栈输出到日志文件
Dec 26 Python
python3正则模块re的使用方法详解
Feb 11 Python
pycharm激活码快速激活及使用步骤
Mar 12 Python
python中delattr删除对象方法的代码分析
Dec 15 Python
python pyg2plot的原理知识点总结
Feb 28 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利用事务处理转账问题
2015/04/22 PHP
基于PHP实现数据分页显示功能
2016/05/26 PHP
js前台判断开始时间是否小于结束时间
2012/02/23 Javascript
jQuery 瀑布流 浮动布局(一)(延迟AJAX加载图片)
2012/05/23 Javascript
js Select下拉列表框进行多选、移除、交换内容的具体实现方法
2013/08/13 Javascript
JS的参数传递示例介绍
2014/02/08 Javascript
纯CSS3代码实现滑动开关效果
2015/08/19 Javascript
使用jquery/js获取iframe父子级、同级获取元素的方法
2016/08/05 Javascript
利用vscode编写vue的简单配置详解
2017/06/17 Javascript
JSONP 的原理、理解 与 实例分析
2020/05/16 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
[02:41]DOTA2英雄基础教程 谜团
2013/12/10 DOTA
[03:54]DOTA2英雄梦之声_第06期_昆卡
2014/06/23 DOTA
[01:06:54]DOTA2-DPC中国联赛 正赛 RNG vs Dragon BO3 第一场 1月24日
2021/03/11 DOTA
Python中使用第三方库xlutils来追加写入Excel文件示例
2015/04/05 Python
Python实现购物车程序
2018/04/16 Python
NumPy 基本切片和索引的具体使用方法
2019/04/24 Python
Python安装Flask环境及简单应用示例
2019/05/03 Python
python3的url编码和解码,自定义gbk、utf-8的例子
2019/08/22 Python
python读写文件write和flush的实现方式
2020/02/21 Python
银河香水:Galaxy Perfume
2019/03/25 全球购物
澳大利亚鞋仓库:Shoe Warehouse
2019/07/25 全球购物
巴西Mr. Cat在线商店:购买包包和鞋子
2019/09/08 全球购物
.NET面试问题集
2015/12/08 面试题
值传递还是引用传递
2015/02/08 面试题
职高毕业生自我鉴定
2013/10/21 职场文书
个人贷款担保书
2014/04/01 职场文书
《蚕姑娘》教学反思
2014/04/15 职场文书
小学教师评语大全
2014/04/23 职场文书
社区两委对照检查材料
2014/08/23 职场文书
怀孕辞职信怎么写
2015/02/28 职场文书
故意伤害罪辩护词
2015/05/21 职场文书
海洋天堂观后感
2015/06/05 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
jquery插件实现图片悬浮
2021/04/16 jQuery
Hive导入csv文件示例
2022/06/25 数据库