from PyQt6.QtWidgets import QMainWindow, QTableView, QApplication
from PyQt6.QtCore import QAbstractTableModel, QModelIndex, Qt
import typing
class Model(QAbstractTableModel):
def __init__(self):
super().__init__()
self._data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
def data(self, index: QModelIndex, role: int = ...) -> typing.Any:
if role == Qt.ItemDataRole.DisplayRole:
return self._data[index.row()][index.column()]
elif role == Qt.ItemDataRole.TextAlignmentRole:
return Qt.AlignmentFlag.AlignCenter
def setData(self, index: QModelIndex, value: typing.Any, role: int = ...) -> bool:
self._data[index.row()][index.column()] = value
def headerData(self, section: int, orientation: Qt.Orientation, role: int = ...) -> typing.Any:
if role == Qt.ItemDataRole.DisplayRole:
return section
elif role == Qt.ItemDataRole.TextAlignmentRole:
return Qt.AlignmentFlag.AlignCenter
def columnCount(self, parent: QModelIndex = ...) -> int:
return len(self._data[0])
def rowCount(self, parent: QModelIndex = ...) -> int:
return len(self._data)
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.model = Model()
self.table = QTableView()
self.table.setModel(self.model)
self.setCentralWidget(self.table)
app = QApplication([])
window = MainWindow()
window.show()
app.exec()
# your code goes here
ZnJvbSBQeVF0Ni5RdFdpZGdldHMgaW1wb3J0IFFNYWluV2luZG93LCBRVGFibGVWaWV3LCBRQXBwbGljYXRpb24KZnJvbSBQeVF0Ni5RdENvcmUgaW1wb3J0IFFBYnN0cmFjdFRhYmxlTW9kZWwsIFFNb2RlbEluZGV4LCBRdAppbXBvcnQgdHlwaW5nCgoKY2xhc3MgTW9kZWwoUUFic3RyYWN0VGFibGVNb2RlbCk6CgogICAgZGVmIF9faW5pdF9fKHNlbGYpOgogICAgICAgIHN1cGVyKCkuX19pbml0X18oKQogICAgICAgIHNlbGYuX2RhdGEgPSBbWzEsIDIsIDNdLCBbNCwgNSwgNl0sIFs3LCA4LCA5XV0KCiAgICBkZWYgZGF0YShzZWxmLCBpbmRleDogUU1vZGVsSW5kZXgsIHJvbGU6IGludCA9IC4uLikgLT4gdHlwaW5nLkFueToKCiAgICAgICAgaWYgcm9sZSA9PSBRdC5JdGVtRGF0YVJvbGUuRGlzcGxheVJvbGU6CiAgICAgICAgICAgIHJldHVybiBzZWxmLl9kYXRhW2luZGV4LnJvdygpXVtpbmRleC5jb2x1bW4oKV0KCiAgICAgICAgZWxpZiByb2xlID09IFF0Lkl0ZW1EYXRhUm9sZS5UZXh0QWxpZ25tZW50Um9sZToKICAgICAgICAgICAgcmV0dXJuIFF0LkFsaWdubWVudEZsYWcuQWxpZ25DZW50ZXIKCiAgICBkZWYgc2V0RGF0YShzZWxmLCBpbmRleDogUU1vZGVsSW5kZXgsIHZhbHVlOiB0eXBpbmcuQW55LCByb2xlOiBpbnQgPSAuLi4pIC0+IGJvb2w6CiAgICAgICAgc2VsZi5fZGF0YVtpbmRleC5yb3coKV1baW5kZXguY29sdW1uKCldID0gdmFsdWUKCiAgICBkZWYgaGVhZGVyRGF0YShzZWxmLCBzZWN0aW9uOiBpbnQsIG9yaWVudGF0aW9uOiBRdC5PcmllbnRhdGlvbiwgcm9sZTogaW50ID0gLi4uKSAtPiB0eXBpbmcuQW55OgoKICAgICAgICBpZiByb2xlID09IFF0Lkl0ZW1EYXRhUm9sZS5EaXNwbGF5Um9sZToKICAgICAgICAgICAgcmV0dXJuIHNlY3Rpb24KCiAgICAgICAgZWxpZiByb2xlID09IFF0Lkl0ZW1EYXRhUm9sZS5UZXh0QWxpZ25tZW50Um9sZToKICAgICAgICAgICAgcmV0dXJuIFF0LkFsaWdubWVudEZsYWcuQWxpZ25DZW50ZXIKCiAgICBkZWYgY29sdW1uQ291bnQoc2VsZiwgcGFyZW50OiBRTW9kZWxJbmRleCA9IC4uLikgLT4gaW50OgogICAgICAgIHJldHVybiBsZW4oc2VsZi5fZGF0YVswXSkKCiAgICBkZWYgcm93Q291bnQoc2VsZiwgcGFyZW50OiBRTW9kZWxJbmRleCA9IC4uLikgLT4gaW50OgogICAgICAgIHJldHVybiBsZW4oc2VsZi5fZGF0YSkKCgpjbGFzcyBNYWluV2luZG93KFFNYWluV2luZG93KToKCiAgICBkZWYgX19pbml0X18oc2VsZik6CiAgICAgICAgc3VwZXIoKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5tb2RlbCA9IE1vZGVsKCkKCiAgICAgICAgc2VsZi50YWJsZSA9IFFUYWJsZVZpZXcoKQogICAgICAgIHNlbGYudGFibGUuc2V0TW9kZWwoc2VsZi5tb2RlbCkKCiAgICAgICAgc2VsZi5zZXRDZW50cmFsV2lkZ2V0KHNlbGYudGFibGUpCgoKYXBwID0gUUFwcGxpY2F0aW9uKFtdKQoKd2luZG93ID0gTWFpbldpbmRvdygpCndpbmRvdy5zaG93KCkKCmFwcC5leGVjKCkKIyB5b3VyIGNvZGUgZ29lcyBoZXJl