学习PyQt6,PyQt6 是一个用于创建图形用户界面(GUI)应用程序的 Python 库,它提供了对 Qt 框架的完整绑定和封装。Qt 是一个功能强大、跨平台的 C++ 应用程序开发框架,被广泛用于开发跨平台的 GUI 应用程序。
- PyQt6库允许开发人员使用Python语言创建丰富、交互式的GUI应用程序,具有各种功能和特性。以下是PyQt6的一些主要特点和优势:
- 跨平台支持:PyQt6支持多个平台,包括Windows、macOS、Linux和其他一些操作系统。这意味着您可以使用相同的代码基础轻松地在不同的操作系统上构建应用程序。
- 强大的GUI控件:PyQt6提供了大量的Qt控件和小部件,包括按钮、标签、文本框、列表框、表格、菜单等等。这些控件使开发人员能够创建各种界面元素来满足应用程序的需求。
- 丰富的功能和特性:PyQt6提供了许多功能和特性,包括布局管理、事件处理、信号与槽机制、动画效果、绘图、多线程支持、数据库访问等等。这些功能使开发人员能够构建复杂和功能丰富的应用程序。
- 可扩展性:PyQt6是一个灵活的库,它允许开发人员根据需要进行自定义和扩展。您可以使用Qt的底层功能和API,编写自己的定制控件和功能。
- 文档和社区支持:PyQt6拥有详细的文档和丰富的社区支持,这使得学习和使用PyQt6变得更加容易。您可以在文档中找到大量的示例代码、教程和指南,以及在社区中获得帮助和支持。
前几天转发了一个PyQt6的开发的一个小例子。
这几天也在加紧学习。PyQt6安装比较简单,便于打包程序,可以单独建立个虚拟环境:
conda create --name PyQt6 python=3.9
pip install PyQt6
pip install pyqt6-tools
PyQt6-tools安装好后,会有一个Qt Designer设计器,可以拖动进行简单的界面设计,再通过pyuic6.exe这个程序把设计好的ui界面转化成py代码,在这些代码的基础上就可以实现有图形界面的python代码开发了。
比如设计这样一个界面:
把设计好的界面保存成ColorD.ui,通过pyuic6.exe把ui转化成py代码。搜索pyuic6.exe文件的位置,把这个路径加入到系统path。在cmd命令行输入:
pyuic6 -x ColorD.ui -o ColorD.py
转好的代码如下:
from PyQt6 import QtCore, QtGui, QtWidgets
from PyQt6.QtWidgets import QColorDialog,QFontDialog
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("Form")
Form.resize(400, 300)
self.verticalLayout = QtWidgets.QVBoxLayout(Form)
self.verticalLayout.setObjectName("verticalLayout")
self.textEdit = QtWidgets.QTextEdit(parent=Form)
font = QtGui.QFont()
font.setPointSize(14)
self.textEdit.setFont(font)
self.textEdit.setObjectName("textEdit")
self.verticalLayout.addWidget(self.textEdit)
self.horizontalLayout = QtWidgets.QHBoxLayout()
self.horizontalLayout.setObjectName("horizontalLayout")
self.pushButton = QtWidgets.QPushButton(parent=Form)
font = QtGui.QFont()
font.setPointSize(12)
self.pushButton.setFont(font)
self.pushButton.setObjectName("pushButton")
self.horizontalLayout.addWidget(self.pushButton)
self.pushButton.clicked.connect(self.ColorDialog)
self.pushButton_2 = QtWidgets.QPushButton(parent=Form)
font = QtGui.QFont()
font.setPointSize(12)
self.pushButton_2.setFont(font)
self.pushButton_2.setObjectName("pushButton_2")
self.pushButton_2.clicked.connect(self.fontDialog)
self.horizontalLayout.addWidget(self.pushButton_2)
self.verticalLayout.addLayout(self.horizontalLayout)
self.retranslateUi(Form)
QtCore.QMetaObject.connectSlotsByName(Form)
def ColorDialog(self):
color = QColorDialog.getColor()
self.textEdit.setTextColor(color)
def fontDialog(self):
font,ok = QFontDialog.getFont()
if ok:
self.textEdit.setFont(font)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "Form"))
self.pushButton.setText(_translate("Form", "Color Dialog"))
self.pushButton_2.setText(_translate("Form", "Font Dialog"))
if __name__ == "__main__":
import sys
app = QtWidgets.QApplication( sys.argv)
Form = QtWidgets.QWidget()
ui = Ui_Form()
ui.setupUi(Form)
Form.show()
sys.exit(app.exec())
运行:
我想做一个带有图形界面的一个Ping的程序,提前准备一个csv的ping列表,三列,前两是名称,第三列是ip,这个表启动程序自动加载,放入到到QTableWidget中,按一定时间间隔ping这些ip列表,把ping的结果放入到QLineEdit中显示,ping通的用绿色字显示,ping不通用红色字显示,并播放一个提示音。最后把Ping的结果总结一下,几通几不能。
设计好的界面如下,这个是直接用代码写的,不是用Qt Designer设计的。
执行结果如图:
代码方面,按钮QPushButton,与动作绑定:
hbox_layout1 = QHBoxLayout()
self.scan_button = QPushButton("开始扫描")
self.scan_button.clicked.connect(self.start_scan)
hbox_layout1.addWidget(self.scan_button)
加载QTableWidget的表,拖动窗口大小时,表格随拖动变化:
self.table_widget = QTableWidget()
self.table_widget.setColumnCount(3)
self.table_widget.setHorizontalHeaderLabels(["台站名", "测项名", "IP地址"])
self.table_widget.setRowCount(len(self.ip_list))
self.table_widget.cellChanged.connect(self.handle_cell_changed)
self.table_widget.setEditTriggers(QTableWidget.EditTrigger.NoEditTriggers)
self.table_widget.setSelectionBehavior(QTableWidget.SelectionBehavior.SelectRows)
self.table_widget.setSelectionMode(QTableWidget.SelectionMode.MultiSelection)
for row, item in enumerate(self.ip_list):
station_name, measurement_name, ip = item
#self.table_widget.setItem(row, 0, QTableWidgetItem(str(row + 1))) # 序号从1开始
self.table_widget.setItem(row, 0, QTableWidgetItem(station_name))
self.table_widget.setItem(row, 1, QTableWidgetItem(measurement_name))
self.table_widget.setItem(row, 2, QTableWidgetItem("10.23.*.*"))
self.table_widget.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
self.table_widget.verticalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
layout.addWidget(self.table_widget)
这个软件功能比较简单,先运行几天,再填加新的功能。