天天看点

Qtdesigner设计实例——计算器 +可执行文件exe制作

文章目录

    • Qtdesigner计算器UI设计+exe制作
      • 一、qtdesigner界面设计:
      • 二、.ui文件转变为.py文件
      • 三、添加功能函数
      • 四、pyinstaller打包成exe文件

Qtdesigner计算器UI设计+exe制作

github地址:https://github.com/lflovelxx/qtdesigner/tree/main

结果视图:

Qtdesigner设计实例——计算器 +可执行文件exe制作

一、qtdesigner界面设计:

界面详细设计参考:

基于PyQt5和Qt Designer的简易加法计算器的制作

qtdesigner界面:

Qtdesigner设计实例——计算器 +可执行文件exe制作

设计步骤:

  1. 新建一个mainwindow
    Qtdesigner设计实例——计算器 +可执行文件exe制作
  2. 拖入16个(4*4)Push button,修改其名称如:bt_1、bt_2等等,修改button上面的数字,修改Push button的最大最小size
    Qtdesigner设计实例——计算器 +可执行文件exe制作
  3. 设置布局格式为网格(栅格)布局
  4. 拖入一个LCD number主键,修改其高度
    Qtdesigner设计实例——计算器 +可执行文件exe制作
  5. 主窗口布局选择上下布局
  6. 调整窗口大小到一个合适的位置,如果间隔太小可以插入spacer组件来控制
  7. 设置主窗口最大、最小size相同(使之不变形)
    Qtdesigner设计实例——计算器 +可执行文件exe制作
  8. 插入信号与槽函数(详细参考https://blog.csdn.net/qq_42679566/article/details/103319505)
  9. 保存.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
           

github地址:https://github.com/lflovelxx/qtdesigner/tree/main

继续阅读