写在前面

不知道干啥, 所以想起本科的时候常常使用Qt-C++做上位机还有趣, 想着现在全都是用python罗列代码, 能不能结合python跟Qt界面做上位机或者开发界面软件, 找了一下还真有

本文目的是为了了解Qt+python结合开发界面软件的技巧,不是为了完成计算器的算法,所以希望读者注重重点

搬山道人登场
吐槽一下,python的那个xx界面实在是太丑了,仿佛回到xp时代

  • 环境
    win10, python3.6
  • python包安装
    pip install PyQt5
  • qt design.exe
    这个需要安装Anconda, 自带的一个插件, 当然不想安装的话可以直接上网下载独立的design.exe软件

1 界面ui设计

1.1 打开软件design.exe

在这里插入图片描述

1.2 界面设计

在这里插入图片描述
在这里插入图片描述保存后是个这
在这里插入图片描述

1.3 ui转.py类

注意这时候python包中的pyuic5.exe能够将ui转化为对应的py文件类
在这里插入图片描述在这里插入图片描述

2 代码

这里就要了解Qt的知识了, Qt的核心是信号与槽, 其实就是一个控件被操作了点啥, 触发了一系列的操作
pushButton_add.pressed.connect(function) 表示按钮被按下,激活函数function

from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
import operator # python内置包, 包含各类计算
from MainWindow import Ui_Dialog # 刚设计的UI

# Calculator state.

class MainWindow(QMainWindow, Ui_Dialog): # 类继承于ui
    def __init__(self, *args, **kwargs):
        super(MainWindow, self).__init__(*args, **kwargs)
        self.setupUi(self) # 这是初始化ui上的控件
        self.show() # 显示UI, 可以在主函数中加入window.show()
        # Setup numbers.
        for n in range(0, 10): # 与10个数字按键建立联系, 每次按一个按键, 连接到输入的显示当中
            getattr(self, 'pushButton_%s' % n).pressed.connect(lambda v=n:self.input_number(v))
        # getattr(类, 属性值) 获取属性值 , 按钮%s的属性值按下后连接到对应的值
        # 
        # Setup operations.
        self.pushButton_add.pressed.connect(lambda: self.operation(operator.add))
        self.pushButton_sub.pressed.connect(lambda: self.operation(operator.sub))
        self.pushButton_mul.pressed.connect(lambda: self.operation(operator.mul))
        self.pushButton_div.pressed.connect(lambda: self.operation(operator.truediv))
        #  
        self.pushButton_equ.pressed.connect(self.equals)
        self.pushButton_re.pressed.connect(self.project_init)
        self.project_init()
        
    def input_number(self, v):
        self.input_numb[self.state] = self.input_numb[self.state]*10+v
        self.display(self.input_numb[self.state])

    def display(self, number):
        self.lcdNumber.display(number)

    def project_init(self):
        self.state = 0 # 0是第一个值, 1是第二个值, 2是第三个值 2+596 = 
        self.display_number = 0 # 数码管显示部分
        self.last_operation = None
        self.current_op = None
        self.input_numb = [0,0] # 保存计算的两个值
        self.display("0")

    def operation(self, op): # 输入加减乘除
        self.state = 1 # 标识有计算标识符
        self.current_op = op
        # self.display("0")
        self.input_numb[1]=0 # 操作数2清零

    def equals(self):
        self.state = 0
        self.display(self.current_op(self.input_numb[0], self.input_numb[1]))
        self.input_numb[0]=0
        self.input_numb[1]=0
        pass


if __name__ == '__main__':
    import sys
    app = QApplication(sys.argv)
    app.setApplicationName("zjq")
    window = MainWindow()
    # window.show()
    sys.exit(app.exec_())

2.1代码流程

MainWindow类继承了我们刚设计的ui
然后使用在主程序中实例类

初始化时将数据跟界面初始化,
当有数据输入,保存到input_numb第一个空间
当有操作符输入时, 开始将接下来输入的数据保存到input_numb第二个空间
当有=输入, 将input_numb两个数进行计算

本文主要了解ui控件使用, 按钮的press方法和lcd的display方法,
其他控件的其他方法需要阅读Qt使用手册,不多赘述, 设计流程如上, ui的设计注重细节排版,同时Qt的系统开发有很多前景,尤其是嵌入式方面的开发,当然桌面软件其实也可胜任, 如桌面QQ即可由QQ设计

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐