The PyQt4 code porting of Model/View Tutorial examples in Qt4.8’s Reference Documentation
2.1 A Read Only Table
import sys from PyQt4.QtGui import * from PyQt4.QtCore 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 = Qt.DisplayRole) : if (role == Qt.DisplayRole): return "Row{}, Column{}".format(index.row() + 1, index.column() +1) return None if __name__ == '__main__': app =QApplication(sys.argv) tableView=QTableView() myModel = MyModel (None); tableView.setModel( myModel ); tableView.show(); sys.exit(app.exec_())
2.2 Extending the Read Only Example with Roles
import sys from PyQt4.QtGui import * from PyQt4.QtCore 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) if role== Qt.FontRole: if (row == 0 and col == 0) : boldFont=QFont() boldFont.setBold(True) return boldFont; if role== Qt.BackgroundRole: if (row == 1 and col == 2) : redBackground=QBrush (Qt.red) return redBackground; if role== Qt.TextAlignmentRole: if (row == 1 and col == 1) : return Qt.AlignRight + Qt.AlignVCenter; if role== Qt.CheckStateRole: if (row == 1 and col == 0) : return Qt.Checked; return None if __name__ == '__main__': app =QApplication(sys.argv) tableView=QTableView() myModel = MyModel (None) tableView.setModel( myModel ) tableView.show() sys.exit(app.exec_())
2.3 A Clock inside a Table Cell
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtNetwork import *
from PyQt5.QtWidgets import *
class MyModel(QAbstractTableModel):
def __init__(self, parent=None):
super().__init__(parent)
timer = QTimer(self)
timer.setInterval(1000)
timer.timeout.connect(self.timerHit)
timer.start()
def timerHit(self):
topLeft = self.createIndex(0, 0)
self.dataChanged.emit(topLeft, topLeft)
def data(self, index, role=Qt.DisplayRole):
row = index.row()
col = index.column()
if role == Qt.DisplayRole:
if (row == 0 and col == 0):
return QTime.currentTime().toString()
return None
def rowCount(self, parent=QModelIndex()):
return 2
def columnCount(self, parent=QModelIndex()):
return 3
if __name__ == '__main__':
app = QApplication(sys.argv)
tableView = QTableView()
myModel = MyModel(None)
tableView.setModel(myModel)
tableView.show()
sys.exit(app.exec_())
2.4 Setting up Headers for Columns and Rows
import sys from PyQt4.QtGui import * from PyQt4.QtCore 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 = Qt.DisplayRole) : if (role == Qt.DisplayRole): return "Row{}, Column{}".format(index.row() + 1, index.column() +1) return None def headerData(self, section, orientation,role) : if (role == Qt.DisplayRole): if (orientation == Qt.Horizontal) : if section == 0: return ("first"); elif section == 1: return ("second"); elif section == 2: return ("third"); return None if __name__ == '__main__': app =QApplication(sys.argv) tableView=QTableView() myModel = MyModel (None); tableView.setModel( myModel ); tableView.show(); sys.exit(app.exec_())2.5 The Minimal Editing Exampleimport sys from PyQt4.QtGui import * from PyQt4.QtCore import * COLS= 3; ROWS= 2 class MyModel(QAbstractTableModel): editCompleted = pyqtSignal(str) def __init__(self, parent=None): super(MyModel, self).__init__(parent) self.m_gridData=[['' 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 headerData(self, section, orientation,role) : if (role == Qt.DisplayRole): if (orientation == Qt.Horizontal) : if section == 0: return ("first"); elif section == 1: return ("second"); elif section == 2: return ("third"); return None def setData(self, index,value,role= Qt.EditRole): if (role == Qt.EditRole): self.m_gridData[index.row()][index.column()] = str(value) result='' for row in range(ROWS) : for col in range(COLS) : result += self.m_gridData[row][col] + " " self.editCompleted.emit ( result ); return True def flags(self, index): return Qt.ItemIsSelectable Qt.ItemIsEditable Qt.ItemIsEnabled ; class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) tableView=QTableView(self) self.setCentralWidget(tableView); myModel = MyModel (self) tableView.setModel( myModel ); myModel.editCompleted.connect(self.setWindowTitle) def showWindowTitle(self, title): self.setWindowTitle(title); if __name__ == '__main__': app =QApplication(sys.argv) w=MainWindow() w.show(); sys.exit(app.exec_())
3.1 TreeView
import sys from PyQt4.QtGui import * from PyQt4.QtCore import * class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) treeView=QTreeView(self) self.setCentralWidget(treeView); standardModel = QStandardItemModel(self) preparedRow =self.prepareRow("first", "second", "third"); item = standardModel.invisibleRootItem(); item.appendRow(preparedRow); secondRow =self.prepareRow("111", "222", "333") preparedRow[0].appendRow(secondRow); treeView.setModel(standardModel); treeView.expandAll(); def prepareRow(self, first,second,third): rowItems=[QStandardItem(first), QStandardItem(second), QStandardItem(third)] return rowItems; if __name__ == '__main__': app =QApplication(sys.argv) w=MainWindow() w.show(); sys.exit(app.exec_())
3.2 Working with Selections
import sys from PyQt4.QtGui import * from PyQt4.QtCore import * class MainWindow(QMainWindow): def __init__(self, parent=None): super(MainWindow, self).__init__(parent) self.treeView=QTreeView(self) self.setCentralWidget(self.treeView); standardModel = QStandardItemModel(self) rootNode = standardModel.invisibleRootItem(); americaItem = QStandardItem("America"); mexicoItem = QStandardItem("Canada"); usaItem = QStandardItem("USA"); bostonItem = QStandardItem("Boston"); europeItem = QStandardItem("Europe"); italyItem = QStandardItem("Italy"); romeItem = QStandardItem("Rome"); veronaItem = QStandardItem("Verona"); rootNode. appendRow(americaItem); rootNode. appendRow(europeItem); americaItem. appendRow(mexicoItem); americaItem. appendRow(usaItem); usaItem. appendRow(bostonItem); europeItem. appendRow(italyItem); italyItem. appendRow(romeItem); italyItem. appendRow(veronaItem); self.treeView.setModel(standardModel) self.treeView.expandAll() selectionModel= self.treeView.selectionModel() selectionModel.selectionChanged.connect(self.selectionChangedSlot) def selectionChangedSlot(self, newSelection, oldSelection): index = self.treeView.selectionModel().currentIndex(); selectedText = str(index.data(Qt.DisplayRole)) hierarchyLevel=1; seekRoot = index; while(seekRoot.parent() != QModelIndex()): seekRoot = seekRoot.parent(); hierarchyLevel+=1; showString = "{}, Level {}".format(selectedText, hierarchyLevel); self.setWindowTitle(showString); if __name__ == '__main__': app =QApplication(sys.argv) w=MainWindow() w.show(); sys.exit(app.exec_())