pyqt5中QTableView如何实现分页?

表格如何实现分页效果
关注者
7
被浏览
12,462
登录后你可以
不限量看优质回答 私信答主深度交流 精彩内容一键收藏

这几天学习 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))