Qtdesigner计算器UI设计+exe制作
github地址:https://github.com/lflovelxx/qtdesigner/tree/main
结果视图:
一、qtdesigner界面设计:
界面详细设计参考:
基于PyQt5和Qt Designer的简易加法计算器的制作
qtdesigner界面:
设计步骤:
-
新建一个mainwindow
-
拖入16个(4*4)Push button,修改其名称如:bt_1、bt_2等等,修改button上面的数字,修改Push button的最大最小size
-
设置布局格式为网格(栅格)布局
-
拖入一个LCD number主键,修改其高度
-
主窗口布局选择上下布局
-
调整窗口大小到一个合适的位置,如果间隔太小可以插入spacer组件来控制
-
设置主窗口最大、最小size相同(使之不变形)
-
插入信号与槽函数(详细参考https://blog.csdn.net/qq_42679566/article/details/103319505)
-
保存.ui文件
二、.ui文件转变为.py文件
参考:https://www.jianshu.com/p/5b063c5745d0
可以看看转换后的.py文件内容:
# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'calculate.ui'
#
# Created by: PyQt5 UI code generator 5.15.1
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again. Do not edit this file unless you know what you are doing.
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(350, 450)
MainWindow.setMinimumSize(QtCore.QSize(350, 450))
MainWindow.setMaximumSize(QtCore.QSize(350, 450))
MainWindow.setAutoFillBackground(False)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.centralwidget)
self.verticalLayout.setObjectName("verticalLayout")
self.lcdNumber = QtWidgets.QLCDNumber(self.centralwidget)
self.lcdNumber.setMinimumSize(QtCore.QSize(0, 80))
self.lcdNumber.setMaximumSize(QtCore.QSize(16777215, 80))
self.lcdNumber.setObjectName("lcdNumber")
self.verticalLayout.addWidget(self.lcdNumber)
self.widget = QtWidgets.QWidget(self.centralwidget)
self.widget.setMinimumSize(QtCore.QSize(60, 60))
self.widget.setObjectName("widget")
self.gridLayout = QtWidgets.QGridLayout(self.widget)
self.gridLayout.setObjectName("gridLayout")
self.bt_1 = QtWidgets.QPushButton(self.widget)
self.bt_1.setMinimumSize(QtCore.QSize(60, 60))
self.bt_1.setMaximumSize(QtCore.QSize(60, 60))
self.bt_1.setObjectName("bt_1")
self.gridLayout.addWidget(self.bt_1, 0, 0, 1, 1)
self.bt_3 = QtWidgets.QPushButton(self.widget)
self.bt_3.setMinimumSize(QtCore.QSize(60, 60))
self.bt_3.setMaximumSize(QtCore.QSize(60, 60))
self.bt_3.setObjectName("bt_3")
self.gridLayout.addWidget(self.bt_3, 0, 1, 1, 1)
self.bt_mul = QtWidgets.QPushButton(self.widget)
self.bt_mul.setMinimumSize(QtCore.QSize(60, 60))
self.bt_mul.setMaximumSize(QtCore.QSize(60, 60))
self.bt_mul.setObjectName("bt_mul")
self.gridLayout.addWidget(self.bt_mul, 1, 3, 1, 1)
self.bt_0 = QtWidgets.QPushButton(self.widget)
self.bt_0.setMinimumSize(QtCore.QSize(60, 60))
self.bt_0.setMaximumSize(QtCore.QSize(60, 60))
self.bt_0.setObjectName("bt_0")
self.gridLayout.addWidget(self.bt_0, 3, 1, 1, 1)
self.bt_4 = QtWidgets.QPushButton(self.widget)
self.bt_4.setMinimumSize(QtCore.QSize(60, 60))
self.bt_4.setMaximumSize(QtCore.QSize(60, 60))
self.bt_4.setObjectName("bt_4")
self.gridLayout.addWidget(self.bt_4, 0, 2, 1, 1)
self.bt_10 = QtWidgets.QPushButton(self.widget)
self.bt_10.setMinimumSize(QtCore.QSize(60, 60))
self.bt_10.setMaximumSize(QtCore.QSize(60, 60))
self.bt_10.setObjectName("bt_10")
self.gridLayout.addWidget(self.bt_10, 2, 1, 1, 1)
self.bt_equal = QtWidgets.QPushButton(self.widget)
self.bt_equal.setMinimumSize(QtCore.QSize(60, 60))
self.bt_equal.setMaximumSize(QtCore.QSize(60, 60))
self.bt_equal.setObjectName("bt_equal")
self.gridLayout.addWidget(self.bt_equal, 3, 3, 1, 1)
self.bt_div = QtWidgets.QPushButton(self.widget)
self.bt_div.setMinimumSize(QtCore.QSize(60, 60))
self.bt_div.setMaximumSize(QtCore.QSize(60, 60))
self.bt_div.setObjectName("bt_div")
self.gridLayout.addWidget(self.bt_div, 2, 3, 1, 1)
self.bt_8 = QtWidgets.QPushButton(self.widget)
self.bt_8.setMinimumSize(QtCore.QSize(60, 60))
self.bt_8.setMaximumSize(QtCore.QSize(60, 60))
self.bt_8.setObjectName("bt_8")
self.gridLayout.addWidget(self.bt_8, 2, 0, 1, 1)
self.bt_7 = QtWidgets.QPushButton(self.widget)
self.bt_7.setMinimumSize(QtCore.QSize(60, 60))
self.bt_7.setMaximumSize(QtCore.QSize(60, 60))
self.bt_7.setObjectName("bt_7")
self.gridLayout.addWidget(self.bt_7, 1, 2, 1, 1)
self.bt_plus = QtWidgets.QPushButton(self.widget)
self.bt_plus.setMinimumSize(QtCore.QSize(60, 60))
self.bt_plus.setMaximumSize(QtCore.QSize(60, 60))
self.bt_plus.setObjectName("bt_plus")
self.gridLayout.addWidget(self.bt_plus, 3, 0, 1, 1)
self.bt_CE = QtWidgets.QPushButton(self.widget)
self.bt_CE.setMinimumSize(QtCore.QSize(60, 60))
self.bt_CE.setMaximumSize(QtCore.QSize(60, 60))
self.bt_CE.setObjectName("bt_CE")
self.gridLayout.addWidget(self.bt_CE, 0, 3, 1, 1)
self.bt_5 = QtWidgets.QPushButton(self.widget)
self.bt_5.setMinimumSize(QtCore.QSize(60, 60))
self.bt_5.setMaximumSize(QtCore.QSize(60, 60))
self.bt_5.setObjectName("bt_5")
self.gridLayout.addWidget(self.bt_5, 1, 0, 1, 1)
self.bt_6 = QtWidgets.QPushButton(self.widget)
self.bt_6.setMinimumSize(QtCore.QSize(60, 60))
self.bt_6.setMaximumSize(QtCore.QSize(60, 60))
self.bt_6.setObjectName("bt_6")
self.gridLayout.addWidget(self.bt_6, 1, 1, 1, 1)
self.bt_9 = QtWidgets.QPushButton(self.widget)
self.bt_9.setMinimumSize(QtCore.QSize(60, 60))
self.bt_9.setMaximumSize(QtCore.QSize(60, 60))
self.bt_9.setObjectName("bt_9")
self.gridLayout.addWidget(self.bt_9, 2, 2, 1, 1)
self.bt_minus = QtWidgets.QPushButton(self.widget)
self.bt_minus.setMinimumSize(QtCore.QSize(60, 60))
self.bt_minus.setMaximumSize(QtCore.QSize(60, 60))
self.bt_minus.setObjectName("bt_minus")
self.gridLayout.addWidget(self.bt_minus, 3, 2, 1, 1)
self.verticalLayout.addWidget(self.widget)
MainWindow.setCentralWidget(self.centralwidget)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
self.bt_1.clicked.connect(MainWindow.clickNum)
self.bt_3.clicked.connect(MainWindow.clickNum)
self.bt_4.clicked.connect(MainWindow.clickNum)
self.bt_5.clicked.connect(MainWindow.clickNum)
self.bt_6.clicked.connect(MainWindow.clickNum)
self.bt_7.clicked.connect(MainWindow.clickNum)
self.bt_8.clicked.connect(MainWindow.clickNum)
self.bt_10.clicked.connect(MainWindow.clickNum)
self.bt_9.clicked.connect(MainWindow.clickNum)
self.bt_CE.clicked.connect(MainWindow.clickClear)
self.bt_mul.clicked.connect(MainWindow.clickMul)
self.bt_div.clicked.connect(MainWindow.clickDiv)
self.bt_0.clicked.connect(MainWindow.clickNum)
self.bt_minus.clicked.connect(MainWindow.clickMinus)
self.bt_equal.clicked.connect(MainWindow.clickEqu)
self.bt_plus.clicked.connect(MainWindow.clickAdd)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "Calculate tools"))
self.bt_1.setText(_translate("MainWindow", "1"))
self.bt_3.setText(_translate("MainWindow", "2"))
self.bt_mul.setText(_translate("MainWindow", "*"))
self.bt_0.setText(_translate("MainWindow", "0"))
self.bt_4.setText(_translate("MainWindow", "3"))
self.bt_10.setText(_translate("MainWindow", "8"))
self.bt_equal.setText(_translate("MainWindow", "="))
self.bt_div.setText(_translate("MainWindow", "/"))
self.bt_8.setText(_translate("MainWindow", "7"))
self.bt_7.setText(_translate("MainWindow", "6"))
self.bt_plus.setText(_translate("MainWindow", "+"))
self.bt_CE.setText(_translate("MainWindow", "CE"))
self.bt_5.setText(_translate("MainWindow", "4"))
self.bt_6.setText(_translate("MainWindow", "5"))
self.bt_9.setText(_translate("MainWindow", "9"))
self.bt_minus.setText(_translate("MainWindow", "-"))
其中值得注意的地方就是你每一个控件重新定义的名字,如果没有自己定义就需要清晰其默认控件名称是什么
三、添加功能函数
我们接下来新建一个calculate_main.py文件来调用上述UI设计形成的.py文件
由于我们计算器需要有加减乘除的功能,所以在UI设计之中定义了很多的槽函数,我们在继承UI设计类的基础上需要实现这些函数
包括了:
- clickNum: 点击数字后在计算显示框中显示数字
- clickClear:清空显示框
- clickAdd:加法运算
- clickMinus:减法运算
- clickMul:乘法运算
- clickDiv:除法运算
- clickEqu:得到结果
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
from calculate import Ui_MainWindow
class MyWindow(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(MyWindow, self).__init__(parent)
self.setupUi(self)
self.Num = 0 # 设置当前数字为0
self.num_list = [] # 设置一个列表存放往期数字
self.action_list = [] # 存放操作
def clickNum(self):
# self.Num = self.lcdNumber.value() #将显示的数字放到Num里
btn = int(self.sender().text()) # 获取信号发送者的名字
self.Num = self.Num * 10 + btn # 将新输入的数字插入到Num的最后面
self.lcdNumber.display(self.Num) # 将数字显示到上面
def clickAdd(self):
# self.Num = self.lcdNumber.value() #将显示的数字放到Num里
self.num_list.append(self.Num) # 将数字缓存到列表里
self.Num = 0 # 清空Num准备接受下一个数字
self.lcdNumber.display(0) # 显示0
self.action_list.append(1)
def clickMinus(self):
# self.Num = self.lcdNumber.value() #将显示的数字放到Num里
self.num_list.append(self.Num) # 将数字缓存到列表里
self.Num = 0 # 清空Num准备接受下一个数字
self.lcdNumber.display(0) # 显示0
self.action_list.append(2)
def clickMul(self):
# self.Num = self.lcdNumber.value() #将显示的数字放到Num里
self.num_list.append(self.Num) # 将数字缓存到列表里
self.Num = 0 # 清空Num准备接受下一个数字
self.lcdNumber.display(0) # 显示0
self.action_list.append(3)
def clickDiv(self):
# self.Num = self.lcdNumber.value() #将显示的数字放到Num里
self.num_list.append(self.Num) # 将数字缓存到列表里
self.Num = 0 # 清空Num准备接受下一个数字
self.lcdNumber.display(0) # 显示0
self.action_list.append(4)
def clickEqu(self):
# self.Num = self.lcdNumber.value() #将显示的数字放到Num里
self.num_list.append(self.Num) # 将数字缓存到列表里
if (len(self.action_list)>0):
action = self.action_list.pop() # 获取最后一个操作
if action == 1:
if len(self.num_list)>=2:
self.lcdNumber.display(self.num_list[-2]+self.num_list[-1]) # 加
self.Num = self.num_list[-2]+self.num_list[-1]
else:
self.lcdNumber.display(0 + self.num_list[-1]) # 加(考虑第一个输入是符号的情况,默认为0+输入值)
self.Num = 0 + self.num_list[-1]
elif action ==2:
if len(self.num_list) >= 2:
self.lcdNumber.display(self.num_list[-2]-self.num_list[-1]) # 减
self.Num = self.num_list[-2] - self.num_list[-1]
else:
self.lcdNumber.display(0 - self.num_list[-1]) # 减(考虑第一个输入是符号的情况,默认为0-输入值)
self.Num =0 - self.num_list[-1]
elif action ==3:
if len(self.num_list)>=2:
self.lcdNumber.display(self.num_list[-2]*self.num_list[-1]) # 乘
self.Num = self.num_list[-2] * self.num_list[-1]
else:
self.lcdNumber.display(0) # 乘(考虑第一个输入是符号的情况,默认为0*输入值)
self.Num = 0
else:
if self.num_list[-1]==0:
self.lcdNumber.display(0) # 被除数为0,发生错误
self.Num = 0
else:
if len(self.num_list)>=2:
self.lcdNumber.display(self.num_list[-2]/self.num_list[-1]) # 除
self.Num = self.num_list[-2] / self.num_list[-1]
else:
self.lcdNumber.display(0) # 除(考虑第一个输入是符号的情况,默认为0/输入值)
self.Num = 0
self.action_list = [] # 清空操作
self.num_list = []
else:
self.lcdNumber.display(self.num)
def clickClear(self):
# self.Num = self.lcdNumber.value() #将显示的数字放到Num里
self.num_list = [] # 清空列表
self.Num = 0 # 清空Num缓存
self.lcdNumber.display(0) # 显示0
if __name__ == '__main__':
app = QApplication(sys.argv)
myWin = MyWindow()
myWin.show()
sys.exit(app.exec_())
四、pyinstaller打包成exe文件
pyinstaller -F -w calculate_main.py