PyQt5 GUI编程

瑞星  金牌会员 | 2024-5-14 17:02:06 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 869|帖子 869|积分 2607

一.PyQt5简介

PyQt5是一个用于创建图形用户界面(GUI)应用步伐的跨平台工具集,它将Qt库(广泛用于C++编程语言中创建丰富的GUI应用步伐)的功能包装给Python使用者。PyQt5是由Riverbank Computing开辟的,并且可以在所有主流操作系统上运行,包含Windows、macOS和Linux。
PyQt5包罗了超过620个类和6000个函数和方法。这个框架支持包罗SQL数据库、线程、Unicode、正则表达式、网络编程等高级功能。除了GUI功能外,PyQt5还答应用户访问Qt的模子/视图架构和QML(Qt Modeling Language),这是一种专门为创建动态和自界说用户界面而设计的语言。
二.环境搭建

1.终端使用pip安装PyQt5库
  1. pip install -i https://pypi.tuna.tsinghua.edu.cn/simple PyQt5
复制代码
2.假如出现Could not build wheels for PyQt5_sip, which is required to install pyproject.toml-based projects报错信息

 3.先安装 Visual Studio 后再安装PyQt5即可,终端执行如下指令
  1. wget https://aka.ms/vs/17/release/vs_BuildTools.exe -o vs_BuildTools.exe ; cmd /c vs_BuildTools.exe
复制代码
勾选C++/CLI后安装就行

三.根本用法

1.PyQt5常见的模块

QApplication这个类管理GUI应用步伐的控制流和主要设置,并且是每个PyQt5应用步伐中必须有的部分
QWidget所有用户界面对象的基类。当你想创建一个自界说的窗口时,你会使用大概继承这个类
QLabel用于展示文本或图片的类
QtCore 其他模块使用的焦点非 GUI 类
QAction用于处理菜单栏、工具栏或快捷键等的动作。
QtSql使用 SQL 举行数据库集成的类
QtXml处理 XML 的类
QSlider滑动条,让用户通过滑动选择一个数值。
 
2.一个简单的窗口创建
  1. import sys
  2. from PyQt5.QtCore import *
  3. from PyQt5.QtGui import *
  4. from PyQt5.QtWidgets import QWidget, QLabel, QMessageBox, QApplication
  5. def windows():
  6.     # 创建一个 QApplication 类的应用程序对象
  7.     app = QApplication(sys.argv)
  8.     # 基于QWidget类声明窗口
  9.     w = QWidget()
  10.     # 添加一个QLabel对象,并将标签添加“helloworld”文本。
  11.     b = QLabel(w)
  12.     b.setText("Hello World!")
  13.     # 设置文本控件在窗口中的位置(x,y)
  14.     b.move(50, 50)
  15.     # 设置label控件的长和宽
  16.     b.resize(100,20)
  17.     # 设置字体样式大小
  18.     font = QFont()
  19.     font.setFamily("Arial")  # 字体样式,中文英文都可(“楷体”)
  20.     font.setPointSize(20)  # 字体大小
  21.     b.setFont(font)
  22.     # 通过 setGeometry() 方法定义窗口的大小和位置(x,y,w,h)
  23.     w.setGeometry(100, 100, 500, 1000)
  24.     # 设置窗口标题
  25.     w.setWindowTitle("PyQt5")
  26.     # 显示窗口
  27.     w.show()
  28.     # 进入应用程序的主循环app.exec_()方法(窗口一直显示)
  29.     sys.exit(app.exec_())
  30. if __name__ == '__main__':
  31.     windows()
复制代码
备注写的很详细了,这里就不一一介绍每行代码的意思了。
3.窗口icon设置
  1. import sys
  2. from PyQt5.QtGui import *
  3. from PyQt5.QtWidgets import QWidget, QApplication  # 导入尽量用具体类,不用*
  4. class Window(QWidget):
  5.     def __init__(self, parent=None):
  6.         super().__init__(parent)
  7.         self.initUI()
  8.         self.setGeometry(100, 100, 500, 500)
  9.         self.setWindowTitle("PyQt5")
  10.     # 设置icon
  11.     def initUI(self):
  12.         self.setWindowIcon(QIcon('./2.jpg'))  # 设置窗口左上角icon
  13. def main():
  14.     app = QApplication(sys.argv)
  15.     ex = Window()
  16.     ex.show()
  17.     sys.exit(app.exec_())
  18. if __name__ == '__main__':
  19.     main()
复制代码
上述代码中,我们在initUI函数中,调用父类setWindowIcon()方法去设置窗口icon,在Window类中初始化时去调用initUI函数来实现设置icon。
4.QLabel控件
  1.     def qlabel(self):
  2.         font = QFont()
  3.         font.setFamily("Arial")
  4.         font.setPointSize(16)
  5.         label = QLabel(self)
  6.         label.setText("Hello World")  # 设置文本
  7.         label.setFont(font)  # 设置文本字体类型及大小
  8.         label.move(50, 20)  # 控件在窗口的位置
复制代码
这里和如上写法一致,在Window类中写一个qlabel函数,里面去调用QLabel,再在Window类中初始化时调用这个函数即可(使用QLabel模块时需提前导入该模块),我们来看下效果。

5.tips信息提示框
  1.     def tips(self):
  2.         # 创建一个按钮控件
  3.         btn = QPushButton('Button', self)
  4.         # 设置文本字体及大小
  5.         btn.setFont(QFont('SansSerif', 50))
  6.         # 设置tips
  7.         btn.setToolTip('This is a widget')
  8.         # 设置按钮在窗口的位置
  9.         btn.move(100, 100)
复制代码
效果如下,鼠标悬浮在button上时,会出现tips信息弹框。

6.关闭二次确定弹框

自动关闭窗口(即点击窗口右上角X),弹出二次确定弹框,提示是否关闭。
  1. import sys
  2. from PyQt5.QtGui import *
  3. from PyQt5.QtWidgets import QWidget, QApplication, QMessageBox, QDesktopWidget  # 导入尽量用具体类,不用*
  4. class Window(QWidget):
  5.     def __init__(self, parent=None):
  6.         super().__init__(parent)
  7.         self.initUI()
  8.         self.setGeometry(100, 100, 500, 500)
  9.         self.setWindowTitle("PyQt5")
  10.         self.center()
  11.     # 设置icon
  12.     def initUI(self):
  13.         self.setWindowIcon(QIcon('./2.jpg'))
  14.     def closeEvent(self, event):  # 关闭二次确定弹框
  15.         reply = QMessageBox.question(self, '是否关闭',
  16.                                      "Are you sure to quit?", QMessageBox.Yes, QMessageBox.No)
  17.         if reply == QMessageBox.Yes:
  18.             event.accept()  # 关闭窗口
  19.         else:
  20.             event.ignore()  # 不关闭
  21.     def center(self):  # 设置窗口居中
  22.         qt = self.frameGeometry()   # 获取需要操作的窗口位置,长宽(即设置的setGeometry)
  23.         cp = QDesktopWidget().availableGeometry().center()  # 获取电脑分辨率
  24.         qt.moveCenter(cp)  # 获取电脑中间位置
  25.         self.move(qt.topLeft())  # 将窗口移动到中间位置
  26. def main():
  27.     app = QApplication(sys.argv)
  28.     ex = Window()
  29.     ex.show()
  30.     sys.exit(app.exec_())
  31. if __name__ == '__main__':
  32.     main()
复制代码
上述代码中重写了父类中的closeEvent方法,通过QMessageBox.question()来获取用户行为,event.accept()来确定关闭窗口。

7.关闭窗口事件
  1.     def clos(self):
  2.         qbtn = QPushButton('Quit', self)  # 创建一个按钮
  3.         qbtn.clicked.connect(QCoreApplication.instance().quit)  # 回调关闭事件
  4.         qbtn.setToolTip("点击关闭窗口")  # tips提示
  5.         qbtn.move(0, 0)
复制代码
如下图效果,鼠标点击Quit按钮后窗口关闭,其效果和关闭按钮X一致。

8.菜单栏和工具栏

QMainWindow用于创建主应用步伐窗口的类。它是 QWidget 的一个子类,提供了创建具有菜单栏、工具栏、状态栏等的主窗口所需的功能。
1)状态栏
  1. import sys
  2. from PyQt5.QtWidgets import QMainWindow, QApplication
  3. class Example(QMainWindow):
  4.     def __init__(self):
  5.         super().__init__()
  6.         self.initUI()
  7.     def initUI(self):
  8.         self.setGeometry(100, 100, 500, 500)
  9.         self.setWindowTitle('Statusbar')
  10.         self.statusBar().showMessage("状态栏")  # 设置状态栏
  11. if __name__ == '__main__':
  12.     app = QApplication(sys.argv)
  13.     ex = Example()
  14.     ex.show()
  15.     sys.exit(app.exec_())
复制代码
状态栏的设置很简单,通过调用QMainWindow的statusBar()方法创建状态栏,showMessage()来设置状态栏表现的文本。

2)菜单栏
  1.     def bar(self):
  2.         action = QAction(QIcon('./2.jpg'), '登录', self)  # 创建QAction实例
  3.         action.setShortcut('Ctrl+a')  # 设置快捷键操作
  4.         action.setStatusTip('登录')  # 状态栏提示,窗口的左下角出现,鼠标悬停在选项上会出现
  5.         action.triggered.connect(qApp.quit)  # 点击事件后回调的方法(qApp.quit关闭窗口)
  6.         menubar = self.menuBar()  # 创建一个菜单栏
  7.         menu = menubar.addMenu('File')  # 设置菜单栏tab
  8.         menu.addAction(action)  # 关联事件
复制代码
用过menuBar()创建一个菜单栏,并添加addMenu()tab项,通过addAction()添加QAction行为动作,具体效果如下。

 triggered.connect(qApp.quit)设置了触发动作后回调事件,即点击登录选项或快捷键Ctrl+A时会触发qApp.quit关闭窗口。上诉中我们只创建了一个菜单栏并只绑定了一个QAction假如想要多个菜单栏多个动作,可以创建多个addMenu(),下面看下具体实例。
  1.    def bar(self):
  2.         action = QAction(QIcon('./2.jpg'), '登录', self)  # 创建QAction实例
  3.         action.setShortcut('Ctrl+a')  # 设置快捷键操作
  4.         action.setStatusTip('登录')  # 状态栏提示,窗口的左下角出现,鼠标悬停在选项上会出现
  5.         action.triggered.connect(qApp.quit)  # 点击事件后回调的方法(qApp.quit关闭窗口)
  6.         action1 = QAction(QIcon('./2.jpg'), '登录', self)  # 创建QAction实例
  7.         action1.setShortcut('Ctrl+a')  # 设置快捷键操作
  8.         action1.setStatusTip('退出')  # 状态栏提示,窗口的左下角出现,鼠标悬停在选项上会出现
  9.         action1.triggered.connect(qApp.quit)  # 点击事件后回调的方法(qApp.quit关闭窗口)
  10.         menubar = self.menuBar()  # 创建一个菜单栏
  11.         menu = menubar.addMenu('File')  # 设置菜单栏tab
  12.         menubar1 = self.menuBar()  # 创建一个菜单栏
  13.         menu1 = menubar1.addMenu('File1')  # 设置菜单栏tab
  14.         menu.addAction(action)  # 关联事件
  15.         menu.addAction(action1)  # 关联事件
复制代码
3)子菜单栏
上面我们只是实现了一级菜单栏,那么在需求中要求创建二级,三级大概多级菜单,此时就需要用到QMenu()来创建下拉菜单栏了,我们先来看下二级菜单栏的创建。
  1.     # 创建子菜单
  2.     def bar_z(self):
  3.         menubar = self.menuBar()  # 创建菜单栏
  4.         menu = menubar.addMenu('File')  # 设置菜单栏tab
  5.         newmenu = QMenu('一级下拉框', self)  # 创建一个下拉菜单
  6.         impAct = QAction('二级目录', self)  # 设置一个动作
  7.         impAct.triggered.connect(self.btn)  # 点击事件后回调的方法
  8.         newmenu.addAction(impAct)  # 添加动作到下菜单中
  9.         newact = QAction('一级目录', self)  # 创建动作
  10.         menu.addAction(newact)  # 添加动作到菜单栏
  11.         menu.addMenu(newmenu)  # 添加下拉菜单到菜单栏
  12.     def btn(self):
  13.         # 创建一个按钮控件
  14.         btn = QPushButton('Button', self)
  15.         # btn.setGeometry(100, 100, 80, 30)
  16.         btn.move(100, 100)
  17.         btn.setToolTip("button")
  18.         btn.show()
复制代码

 假如我们想创建三级目录甚至更多级的目录,可以创建多个下拉菜单栏,并通过addMenu()添加进去,下面看下具体实现。
  1. # 创建子菜单
  2.     def bar_z(self):
  3.         menubar = self.menuBar()  # 创建菜单栏
  4.         menu = menubar.addMenu('File')  # 设置菜单栏tab
  5.         newmenu1 = QMenu('二级下拉框', self)  # 创建一个下拉菜单
  6.         impAct1 = QAction('三级目录', self)  # 设置一个动作
  7.         impAct1.triggered.connect(self.btn)  # 点击事件后回调的方法
  8.         newmenu1.addAction(impAct1)  # 添加动作到下菜单中
  9.         newmenu = QMenu('一级下拉框', self)  # 创建一个下拉菜单
  10.         impAct = QAction('二级目录', self)  # 设置一个动作
  11.         impAct.triggered.connect(self.btn)  # 点击事件后回调的方法
  12.         newmenu.addAction(impAct)  # 添加动作到下菜单中
  13.         newmenu.addMenu(newmenu1)  # 添加下拉菜单栏到二级菜单下
  14.         newact = QAction('一级目录', self)  # 创建动作
  15.         menu.addAction(newact)  # 添加动作到菜单栏
  16.         menu.addMenu(newmenu)  # 添加下拉菜单到菜单栏
复制代码

4)带复选框的菜单
  1.     def bar_checkable(self):
  2.         menubar = self.menuBar()
  3.         bar_menu = menubar.addMenu('View')  # 添加菜单栏
  4.         statact = QAction('复选框', self, checkable=True)  # 创建一个可以勾选的动作
  5.         statact.setStatusTip('View statusbar')
  6.         statact.setChecked(True)  # 设置默认选中
  7.         statact.triggered.connect(self.menu)
  8.         bar_menu.addAction(statact)
  9.     def menu(self, state):
  10.         if state:
  11.             print("勾选后执行的事件")  # 勾选了
  12.         else:
  13.             print("取消勾选执行的事件")  # 取消勾选
复制代码
QAction()中,checkable=True表现可以勾选的动作。

5)右键栏
鼠标悬浮再窗口上,右击打开的菜单栏,此功能需要重写父类中contextMenuEvent()方法,看下代码演示。
  1.     def contextMenuEvent(self, event):
  2.         rightmenu = QMenu(self)  # 创建一个下拉菜单
  3.         # 添加动作
  4.         d = rightmenu.addAction("打印")
  5.         q = rightmenu.addAction("退出")
  6.         ture = rightmenu.addAction("确定")
  7.         action = rightmenu.exec_(self.mapToGlobal(event.pos()))  # exec_()显示菜单。获取动作行为
  8.         if action == d:
  9.             self.btn()
  10.         elif action == q:
  11.             qApp.quit()  # 关闭窗口
  12.         else:
  13.             print("无确定内容")
复制代码
6)工具栏
工具栏可以明白为是多个动作的集合,可以将多个QAction()添加展示出来。
  1.     def bar_tool(self):  # 多个动作集合
  2.         action = QAction("工具1",self)
  3.         action2 = QAction("工具2",self)
  4.         action.setStatusTip("点击退出")
  5.         action.triggered.connect(qApp.quit)
  6.         toolbat = self.addToolBar("工具栏")  # 创建一个工具栏
  7.         toolbat.addAction(action)  # 将动作添加到工具栏
  8.         toolbat.addAction(action2)  # 将动作添加到工具栏
复制代码

7)主窗口表现
这个就不做过多介绍,在初始__init__中调用上诉几种方法即可,默认菜单栏在最顶部,添加的动作会更加调用的先后从左到右排列,工具栏默认在菜单栏下发,这里只看下效果截图。

 9.页面结构

1)坐标结构
  1. import sys
  2. from PyQt5.QtGui import QIcon
  3. from PyQt5.QtWidgets import QLabel, QApplication, QWidget
  4. class Example(QWidget):
  5.     def __init__(self):
  6.         super().__init__()
  7.         self.initUI()
  8.     def initUI(self):
  9.         self.setGeometry(100, 100, 500, 500)
  10.         self.setWindowTitle('Statusbar')
  11.         q1 = QLabel("quit", self)
  12.         q2 = QLabel("quit2", self)
  13.         q3 = QLabel("quit3", self)
  14.         q1.move(20, 20)  # 坐标布局
  15.         q2.move(20, 80)  # 坐标布局
  16.         q3.move(20, 140)  # 坐标布局
  17. if __name__ == '__main__':
  18.     app = QApplication(sys.argv)
  19.     ex = Example()
  20.     ex.show()
  21.     sys.exit(app.exec_())
复制代码
坐标结构 上述中通过move(x, y)方法来设置qlable的位置

2)界面比例结构
  1. import sys
  2. from PyQt5.QtGui import QIcon
  3. from PyQt5.QtWidgets import QApplication, QPushButton, QHBoxLayout, QWidget
  4. class Example(QWidget):
  5.     def __init__(self):
  6.         super().__init__()
  7.         self.initUI()
  8.         self.button()
  9.     def initUI(self):
  10.         self.setGeometry(100, 100, 500, 500)
  11.         self.setWindowTitle('Statusbar')
  12.     def button(self):  # 比例布局
  13.         ok = QPushButton("ok")  # 创建三个按钮
  14.         cancel = QPushButton("cancel")
  15.         cancel1 = QPushButton("cancel1")
  16.         hbox1 = QHBoxLayout()  # 创建一个水平布局
  17.         hbox1.addWidget(ok)  # 添加按钮到水平布局中
  18.         hbox1.addStretch(1)  # 设置水平比例间距
  19.         hbox1.addWidget(cancel)  # 添加按钮到水平布局中
  20.         hbox1.addStretch(1)  # 设置水平比例间距
  21.         hbox1.addWidget(cancel1)
  22.         hbox1.addStretch(6)
  23.         self.setLayout(hbox1)  # 添加到布局器
  24. if __name__ == '__main__':
  25.     app = QApplication(sys.argv)
  26.     ex = Example()
  27.     ex.show()
  28.     sys.exit(app.exec_())
复制代码
水平结构
  1. [/code]上面代码中通过QHBoxLayout() 创建一个水平结构,addWidget()将按钮添加到结构中,再通过addStretch()来设置比例间距,可以看到设置的比例为1:1:6[align=center][img]https://img2024.cnblogs.com/blog/1668630/202403/1668630-20240318175210820-102278827.png[/img][/align]
  2. [align=center][img]https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif[/img][/align][align=center][img]https://images.cnblogs.com/OutliningIndicators/ExpandedBlockStart.gif[/img][/align][code]import sys
  3. from PyQt5.QtGui import QIcon
  4. from PyQt5.QtWidgets import QApplication, QPushButton, QHBoxLayout, QVBoxLayout, QWidget
  5. class Example(QWidget):
  6.     def __init__(self):
  7.         super().__init__()
  8.         self.initUI()
  9.         self.button()
  10.     def initUI(self):
  11.         self.setGeometry(100, 100, 500, 500)
  12.         self.setWindowTitle('Statusbar')
  13.     def button(self):  # 比例布局
  14.         ok = QPushButton("ok")  # 创建三个按钮
  15.         cancel = QPushButton("cancel")
  16.         cancel1 = QPushButton("cancel1")
  17.         hbox = QHBoxLayout()  # 创建一个水平布局
  18.         hbox.addStretch(1)  # 设置水平比例间距(只设置一个stretch,会将按钮挤到最右侧。若stretch写在addWidget下面,则按钮会被寄到最左侧)
  19.         hbox.addWidget(ok)  # 添加按钮到水平布局中
  20.         hbox.addWidget(cancel)
  21.         vbox = QVBoxLayout()  # 创建一个垂直布局
  22.         vbox.addStretch(1)  # 设置垂直比例间距(只设置一个stretch,会将按钮挤到最下面。若stretch写在addlayout下面,则按钮会被寄到最下面)
  23.         vbox.addLayout(hbox)  # 将刚刚创建的水平布局添加到垂直布局中
  24.         self.setLayout(vbox)  # 将垂直布局加到布局器中(按钮位于页面右下角)
  25. if __name__ == '__main__':
  26.     app = QApplication(sys.argv)
  27.     ex = Example()
  28.     ex.show()
  29.     sys.exit(app.exec_())
复制代码
垂直结构

3)栅格化结构
  1. import sys
  2. from PyQt5.QtGui import QIcon
  3. from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QGridLayout
  4. class Example(QWidget):
  5.     def __init__(self):
  6.         super().__init__()
  7.         self.initUI()
  8.         self.Grid()
  9.     def initUI(self):
  10.         self.setGeometry(100, 100, 500, 500)
  11.         self.setWindowTitle('Statusbar')
  12.     def Grid(self):  # 栅格化的按钮
  13.         grid = QGridLayout()  # 创建一个栅格化布局
  14.         name = ["7", "8", "9", "/",
  15.                 "4", "5", "6", "x",
  16.                 "1", "2", "3", "-",
  17.                 "清除", "0", ".", "="]
  18.         # 列表推导式
  19.         pos = [(x, y) for x in range(4) for y in range(4)]
  20.         for names, p in zip(name, pos):  # 同时迭代两个序列
  21.             button = QPushButton(names)  # 创建按钮
  22.             grid.setSpacing(10)  # 设置各个单元格之间的间距
  23.             grid.addWidget(button, *p)  # 添加到栅格化布局中
  24.         self.setLayout(grid)  # 将栅格化布局加到布局器
  25. if __name__ == '__main__':
  26.     app = QApplication(sys.argv)
  27.     ex = Example()
  28.     ex.show()
  29.     sys.exit(app.exec_())
复制代码
栅格化结构效果图

 栅格化结构理论上也是通过坐标来定位的,通过列表推导式可到得到几个坐标(0,0)(0,1)(0,2)(1,0)(1,1)(1,2)..........,然后再通过坐标去逐个添加。
4)实例
  1. import sys
  2. from PyQt5.QtGui import QIcon
  3. from PyQt5.QtWidgets import QLabel, QApplication,QWidget, QGridLayout, \
  4.     QLineEdit, QTextEdit
  5. class Example(QWidget):
  6.     def __init__(self):
  7.         super().__init__()
  8.         self.initUI()
  9.         self.input()
  10.     def initUI(self):
  11.         self.setGeometry(100, 100, 500, 500)
  12.         self.setWindowTitle('Statusbar')
  13.     def input(self):
  14.         grid = QGridLayout()
  15.         # 设置标签
  16.         title = QLabel("title")
  17.         Author = QLabel("Author")
  18.         Review = QLabel("Review")
  19.         # 设置输入框
  20.         titleEdit = QLineEdit()  # 行编辑
  21.         authorEdit = QLineEdit()
  22.         reviewEdit = QTextEdit()  # 文版编辑
  23.         grid.setSpacing(10)  # 设置间距
  24.         grid.addWidget(title, 0, 0)
  25.         grid.addWidget(titleEdit, 0, 1)
  26.         grid.addWidget(Author, 1, 0)
  27.         grid.addWidget(authorEdit, 1, 1)
  28.         grid.addWidget(Review, 2, 0)
  29.         grid.addWidget(reviewEdit, 2, 1)
  30.         self.setLayout(grid)
  31. if __name__ == '__main__':
  32.     app = QApplication(sys.argv)
  33.     ex = Example()
  34.     ex.show()
  35.     sys.exit(app.exec_())
复制代码
实例上述中实例通过QGridLayout()来将QLabel(), QLineEdit(行编辑)  ,QTextEdit(文版编辑) 举行的整合使用,下面看下效果。

四.实例

 以一个简单盘算器功能为例,先来看下代码实现和效果展示
  1. import sys
  2. from PyQt5.QtGui import QIcon
  3. from PyQt5.QtWidgets import QApplication, QPushButton, QWidget, QGridLayout, \
  4.     QLineEdit
  5. class Example(QWidget):
  6.     def __init__(self):
  7.         super().__init__()
  8.         self.initUI()
  9.         self.Grid()
  10.     def initUI(self):
  11.         self.setGeometry(100, 100, 500, 500)
  12.         self.setWindowTitle('Statusbar')
  13.     def Grid(self):  # 栅格化的按钮
  14.         grid = QGridLayout()
  15.         hbox = QLineEdit()
  16.         grid.addWidget(hbox, 0, 0, 1, 4)
  17.         name = [
  18.             "7", "8", "9", "/",
  19.             "4", "5", "6", "*",
  20.             "1", "2", "3", "-",
  21.             "清除", "0", ".", "="]
  22.         # 列表推导式
  23.         pos = [(x, y) for x in range(1,5) for y in range(4)]
  24.         for names, p in zip(name, pos):  # 同时迭代两个序列
  25.             if names == "":
  26.                 continue
  27.             elif names == "hbox":
  28.                 grid.addWidget(hbox, *p)
  29.             else:
  30.                 button = QPushButton(names)
  31.                 grid.addWidget(button, *p)
  32.                 button.clicked.connect(lambda checked, btn_text=names: on_button_clicked(btn_text))
  33.             grid.setSpacing(10)  # 设置各个单元格之间的间距
  34.         self.setLayout(grid)
  35.         def on_button_clicked(btn_text):
  36.             try:
  37.                 if btn_text == "清除":
  38.                     hbox.clear()
  39.                 elif btn_text == "=":
  40.                     str_num = eval(hbox.text())
  41.                     hbox.clear()
  42.                     hbox.insert(str(str_num))
  43.                 else:
  44.                     hbox.insert(btn_text)
  45.             except:
  46.                 hbox.insert("error")
  47. if __name__ == '__main__':
  48.     app = QApplication(sys.argv)
  49.     ex = Example()
  50.     ex.show()
  51.     sys.exit(app.exec_())
复制代码
盘算器

 使用addWidget将输入框添加到栅格化结构中,后面无个参数分别表现:(添加对象,x位置,y位置,占据的单元格高度,占据的单元格宽度)。
  1. grid.addWidget(hbox, 0, 0, 1, 4)
复制代码
QLineEdit()几个常用的方法
  1.         hbox = QLineEdit()
  2.         hbox.setText("默认文案")  # 设置默认文案
  3.         hbox.setPlaceholderText("暗文")  # 当输入框内容为空时显示该文案
  4.         hbox.insert("243")  # 添加
  5.         print(hbox.text())  # 获取框内容
  6.         hbox.clear()  # 清空
复制代码
五.打包

可参考:https://www.cnblogs.com/lihongtaoya/p/17349911.html
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  1. 文章来源:<a id="blog_url"  href="https://www.cnblogs.com/lihongtaoya/" rel="noopener" target="_blank">https://www.cnblogs.com/lihongtaoya/</a> ,请勿转载
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

瑞星

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表