the use of the Rows and Columns flags
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import *
from PyQt5.QtGui import *
class MyModel(QAbstractTableModel):
def __init__(self, parent=None):
super(MyModel, self).__init__(parent)
def rowCount(self, parent=QModelIndex()):
return 2
def columnCount(self, parent=QModelIndex()):
return 3
def data(self, index, role):
row = index.row()
col = index.column()
# print("Row {}, Column {}, role {}".format(index.row() + 1, index.column() + 1, role))
if role == Qt.DisplayRole:
if (row == 0 and col == 1):
return "<--left"
if (row == 1 and col == 1):
return "right-->"
return "Row{}, Column{}, role{}".format(index.row() + 1, index.column() + 1, role)
elif role == Qt.FontRole:
if (row == 0 and col == 0):
boldFont = QFont()
boldFont.setBold(True)
return boldFont
elif role == Qt.BackgroundRole:
if (row == 1 and col == 2):
redBackground = QBrush(Qt.red)
return redBackground
elif role == Qt.TextAlignmentRole:
if (row == 1 and col == 1):
return Qt.AlignRight + Qt.AlignVCenter
elif role == Qt.CheckStateRole:
if (row == 1 and col == 0):
print('CheckStateRole---------', index.data())
return Qt.Unchecked # Checked
return None
# def flags(self, index):
# # return super().flags(index) | Qt.ItemIsUserCheckable | Qt.ItemIsEditable | Qt.ItemIsEnabled
# return Qt.ItemIsSelectable|Qt.ItemIsEditable|Qt.ItemIsEnabled|Qt.ItemIsUserCheckable
# def setData(self, index, value, role):
# if not index.isValid() or role != Qt.CheckStateRole:
# return False
# print('setData CheckStateRole---------', value)
# # self._checked[index.row()][index.column()]=value
# self.dataChanged.emit(index, index)
# return True
if __name__ == '__main__':
app = QApplication(sys.argv)
tableView = QTableView()
myModel = MyModel(None)
tableView.setModel(myModel)
tableView.show()
sys.exit(app.exec_())
the use of the Rows and Columns flags
The PyQt4 code porting of Model/View Programming e-ID4333709
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtWebEngineWidgets import *
from PyQt5.QtWebEngineCore import *
from PyQt5.QtCore import *
COLS = 4
ROWS = 8
class MyModel(QAbstractTableModel):
def __init__(self, parent=None):
super(MyModel, self).__init__(parent)
self.m_gridData = [["Row{}, Column{}".format(row, column) for column in range(COLS)] for row in range(ROWS)]
def rowCount(self, parent=QModelIndex()):
return ROWS
def columnCount(self, parent=QModelIndex()):
return COLS
def data(self, index, role=Qt.DisplayRole):
if (role == Qt.DisplayRole):
return self.m_gridData[index.row()][index.column()]
return None
def setData(self, index, value, role=Qt.EditRole):
if (role == Qt.EditRole):
self.m_gridData[index.row()][index.column()] = str(value)
return True
def flags(self, index):
return Qt.ItemIsSelectable | Qt.ItemIsEditable | Qt.ItemIsEnabled
if __name__ == '__main__':
app = QApplication(sys.argv)
tableView = QTableView()
myModel = MyModel(None)
tableView.setModel(myModel)
selectionModel = tableView.selectionModel()
columnSelection = QItemSelection()
topLeft = myModel.index(0, 1, QModelIndex())
bottomRight = myModel.index(0, 2, QModelIndex())
columnSelection.select(topLeft, bottomRight)
selectionModel.select(columnSelection, QItemSelectionModel.Select | QItemSelectionModel.Columns)
rowSelection = QItemSelection()
topLeft = myModel.index(0, 0, QModelIndex())
bottomRight = myModel.index(1, 0, QModelIndex())
rowSelection.select(topLeft, bottomRight)
selectionModel.select(rowSelection, QItemSelectionModel.Select | QItemSelectionModel.Rows)
tableView.show()
sys.exit(app.exec_())
2.3 A Clock inside a Table Cell
Model/View Tutorial | Qt Widgets 6.6.1
# -*- coding: utf-8 -*-
"""
@author: Taar
"""
#conversion of https://github.com/openwebos/qt/tree/master/examples/tutorials/modelview/3_changingmodel
import sys
from PyQt5 import QtCore, QtGui, QtWidgets
from PyQt5.QtCore import Qt as qt
class MyModel(QtCore.QAbstractTableModel):
#notice that dataChanged is a class attribute from
#the parent class; it's set at creation time
#by inheritance
def __init__(self,parent):
super(MyModel,self).__init__(parent)
timer = QtCore.QTimer(self)
timer.setInterval(1000)
timer.timeout.connect(self.timerHit)
timer.start()
def rowCount(self,n):
return 2
def columnCount(self,n):
return 3
def data(self,index,role):
row = index.row()
col = index.column()
if role == qt.DisplayRole:
if row == 0 and col == 0:
return QtCore.QTime.currentTime().toString()
def timerHit(self):
changed_index = self.index(0,0)
#notice that dataChanged has new
#signature (QtCore.QModelIndex,QtCore.QModelIndex,QVector<int>)
#and that QVector<int> are implemented as lists (of integers)
#self.dataChanged.emit(changed_index,changed_index,[])
#or better, indicated the changed roles :
self.dataChanged.emit(changed_index,changed_index,[qt.DisplayRole])
if __name__ == '__main__':
app = QtWidgets.QApplication.instance()
if app is None:
app= QtWidgets.QApplication(sys.argv)
tableView = QtWidgets.QTableView()
myModel = MyModel(None)
tableView.setModel(myModel)
tableView.show()
app.exec_()