140.Python——PySide6 窗体布局:简易计算器实现

在使用PySide或PyQt中,我们可以使用Qt Designer来可视化设计布局,简单方便,容易上手。但有时我们可能需要使用代码生成组件和布局,以提高效率和完成特定的需求。

本文通过简单的实例:简易计算器,来实现一下窗体代码布局和功能的实现。


窗体全局布局有2种:水平QHBoxLayout和垂直QVBoxLayout。

窗体局部布局有4种:水平QHBoxLayout、垂直QVBoxLayout、网络QGridLayout、表单QFormLayout。


先看一下整体效果

一、界面布局设计分析

界面分两大部分,第一部分是一个单行文本框,用来显示过程和结果,第二部分就是数字和功能按钮的网格。

所以界面整体布局:一个全局垂直布局:放置单行文本框和放置一个局部网格布局。

局部网格布局:根据位置放入相应的按钮。


二、代码实现

实现计算结果的关键:eval函数。

eval() 函数用来执行一个字符串表达式,并返回表达式的值

import sys
from PySide6 import QtCore, QtWidgets,QtGui

class MainWindow(QtWidgets.QWidget): #继承QWidget,不是QMainWindows
    def __init__(self):
        super().__init__()

        #定义一个全局垂直布局
        self.layout=QtWidgets.QVBoxLayout(self)
        
        #定义一个文本框,用来显示过程和结果
        self.lineEdit=QtWidgets.QLineEdit()
        self.lineEdit.setAlignment(QtCore.Qt.AlignRight) #靠右对齐
        self.lineEdit.setFont(QtGui.QFont("",14)) #设置字体大小
        
        #把文本框放入垂直布局
        self.layout.addWidget(self.lineEdit)
        
        #定义一个局部网格布局
        self.gridLayout = QtWidgets.QGridLayout()
        #把局部网格布局放在全局垂直布局中
        self.layout.addLayout(self.gridLayout)
        
        #定义按钮显示名称列表
        names = ["Cls", "Bck", "", "Close",
                 "7", "8", "9", "/",
                 "4", "5", "6", "*",
                 "1", "2", "3", "-",
                 "0", ".", "=", "+"]
        
        #计算按钮放入的行列位置
        positions = [(i, j) for i in range(5) for j in range(4)]
        
        #遍历并定义按钮,放入网络相应的位置。
        for position, name in zip(positions, names):
            if name == "": #跳过空
                continue
            self.button = QtWidgets.QPushButton(name)
            self.button.setFont(QtGui.QFont("",14)) #按钮文本大小设置
            self.gridLayout.addWidget(self.button, *position)
            #信号槽连接
            self.button.clicked.connect(self.button_clicked)
                
    #槽函数
    def button_clicked(self):
        global s
        button = self.sender() #获取按钮
        text= button.text() #获取按钮文本
        if text == "Cls":
            s = ""
        elif text == "Bck":
            s = s[:-1]
        elif text == "Close":
            self.close()
        elif text == "=":
            if s[0] in ["+", "-", "*", "/"] or s[-1] in ["+", "-", "*", "/"]:
                QtWidgets.QMessageBox.information(self, "msg", "input Error")
            else:
                s = str(eval(s))
        else:
            s = s+text
        self.lineEdit.setText(s)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    win = MainWindow()
    win.setWindowTitle("Calc")
    #win.setWindowFlags(QtCore.Qt.WindowMinimizeButtonHint)
    win.show()
    s="" #存放计算表达式
    app.exit(app.exec())

三、运行界面

相关文章

Qt for Python—Qt Designer 概览

前言本系列第三篇文章(Qt for Python学习笔记—应用程序初探 )、第四篇文章(Qt for Python学习笔记—应用程序再探 )中均是使用纯代码方式来开发 PySide6 GUI 应用程序...

PySide:基于 Qt 框架的 Python 高级 UI 库

PySide 是 Python 的官方 Qt 库绑定,由 Qt for Python 提供支持。它允许开发者使用 Python 编写基于 Qt 框架的图形用户界面(GUI)应用。作为一个功能强大的跨平...

使用PySide2做窗体,到底是怎么个事?看这个能不能搞懂

PySide2 是 Qt 框架的 Python 绑定,允许你使用 Python 创建功能强大的跨平台 GUI 应用程序。PySide2 的基本使用方法:安装 PySide2pip install Py...

118.Python——PyQt窗体上显示监控视频画面

在做计算机视觉项目时,经常需要打开和显示监控视频画面,对画面进行分析处理。使用OpenCV打开摄像头显示视频画面,视频可以参看:1.3 OpenCV打开本地摄像头并显示视频画面。本文主要实现在PyQt...

Python Qt GUI设计:将UI文件转换Python文件三种妙招(基础篇—2)

在开始本文之前提醒各位朋友,Python记得安装PyQt5库文件,Python语言功能很强,但是Python自带的GUI开发库Tkinter功能很弱,难以开发出专业的GUI。好在Python语言的开放...

进入Python的世界02外篇-Pycharm配置Pyqt6

为什么这样配置,要开发带UI的python也只能这样了,安装过程如下:一 安装工具打开终端:pip install PyQt6 PyQt6-tools二 打开设置并汉化点击plugin,安装汉化插件,...