一个很好玩的类QAbstractTableModel

import itertools
import datetime

from 载入初始化 import *
from 号码载入后界面 import *

class NumGroupModel(QAbstractTableModel):
    PAGE_SIZE = 1000  # 每页数据行数

    def __init__(self, header_labels,data=None):
        super().__init__()
        self._data = data or []
        self._page_start = -1  # 当前页起始行号
        self._page_end = -1  # 当前页结束行号
        self.header_labels = header_labels

    def headerData(self, section, orientation, role=Qt.DisplayRole):
        if role == Qt.DisplayRole and orientation == Qt.Horizontal:
            return self.header_labels[section]
        return None

    # def sort(self, column, order=Qt.AscendingOrder):
    #     self.layoutAboutToBeChanged.emit()
    #     self._data.sort(key=lambda x: x[column], reverse=(order == Qt.DescendingOrder))
    #     self.layoutChanged.emit()

    def sort(self, column, order=Qt.AscendingOrder):
        self.layoutAboutToBeChanged.emit()
        self._data.sort(key=lambda x: float(x[column]), reverse=(order == Qt.DescendingOrder))
        self.layoutChanged.emit()

    def rowCount(self, parent=None):
        return len(self._data)

    def columnCount(self, parent=None):
        return 7  # 表格列数

    def data(self, index, role=Qt.DisplayRole):
        if not index.isValid():
            return QVariant()
        row = index.row()
        col = index.column()
        if role == Qt.DisplayRole:
            return str(self._data[row][col])
        if role == Qt.TextAlignmentRole:
            return Qt.AlignCenter

        if role == Qt.FontRole:
            font = QFont("Arial", 12)  # 修改为需要的字体和字号
            return font

        # if role == Qt.BackgroundRole:
        #     if col == 1:  # 要设置背景色的列索引
        #         return QColor(Qt.lightGray)

        # if role == Qt.ForegroundRole:
        #     if col == 2:  # 要设置前景色(文本颜色)的列索引
        #         return QColor(Qt.red)

        elif role == Qt.BackgroundRole:
            if row % 2 == 0:
                return QColor(Qt.lightGray)
        return QVariant()

    def setPage(self, page):
        self.beginResetModel()  # 重置模型,清空所有数据
        self._page_start = page * NumGroupModel.PAGE_SIZE
        self._page_end = self._page_start + NumGroupModel.PAGE_SIZE
        self.endResetModel()  # 更新模型,提取新页数据

    def fetchMore(self, index):
        if not index.isValid():
            return
        row = index.row()
        if row < self._page_end:
            return
        current_page = row // NumGroupModel.PAGE_SIZE
        self.setPage(current_page)

    def canFetchMore(self, index):
        if not index.isValid():
            return False
        row = index.row()
        if row >= len(self._data) - 1:
            return False
        return True


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
`QAbstractTableModel` 是 PyQt 中的一个模型,用于管理二维表格数据。与 `QStandardItemModel` 不同,`QAbstractTableModel` 可以管理任意型的表格数据,且支持自定义行列数和数据型。通过继承 `QAbstractTableModel` ,我们可以自定义一个模型,提供相应的数据操作接口。 在 `QAbstractTableModel` 中,我们需要实现以下几个虚函数: - `rowCount()`:获取行数; - `columnCount()`:获取列数; - `data()`:获取指定单元格的数据; - `setData()`:设置指定单元格的数据; - `headerData()`:获取表头数据; - `flags()`:获取单元格的标志位。 例如,以下代码展示了如何创建一个自定义的 `MyTableModel` 模型,并实现上述虚函数: ``` from PyQt5.QtCore import Qt, QModelIndex, QVariant from PyQt5.QtGui import QStandardItemModel, QStandardItem from PyQt5.QtWidgets import QTableView, QApplication from PyQt5.QtCore import QAbstractTableModel class MyTableModel(QAbstractTableModel): def __init__(self, data): super().__init__() self._data = data def rowCount(self, parent=QModelIndex()): return len(self._data) def columnCount(self, parent=QModelIndex()): if len(self._data) > 0: return len(self._data[0]) else: return 0 def data(self, index, role): if role == Qt.DisplayRole: return str(self._data[index.row()][index.column()]) else: return QVariant() def headerData(self, section, orientation, role): if role == Qt.DisplayRole: if orientation == Qt.Horizontal: return "Column %d" % section else: return "Row %d" % section else: return QVariant() def flags(self, index): return Qt.ItemIsEnabled | Qt.ItemIsSelectable # 创建一个二维数据 data = [ [1, 2, 3], [4, 5, 6], [7, 8, 9] ] # 创建一个自定义的 MyTableModel 模型对象 model = MyTableModel(data) # 创建一个 QTableView 视图对象,并将 MyTableModel 模型对象设置到上面 table_view = QTableView() table_view.setModel(model) # 显示视图对象 app = QApplication([]) table_view.show() app.exec_() ``` 这样,我们就创建了一个自定义的 `MyTableModel` 模型,并实现了 `rowCount()`、`columnCount()`、`data()`、`headerData()` 和 `flags()` 等虚函数。可以将这个模型对象设置到 `QTableView` 视图对象上,从而实现表格数据的展示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值