Qt+python之計算器

寫在前面

不知道幹啥, 所以想起本科的時候常常使用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設計

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章