- 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