1
votes

I'm interested in paginated display of table data. I found this link: https://sateeshkumarb.wordpress.com/2012/04/01/paginated-display-of-table-data-in-pyqt/ with interesting code made by PyQt4. I tried to translate it in PyQt5 on python 3.4. Code follows:

import sys
from PyQt5 import QtWidgets, QtCore

class Person(object):
    """Name of the person along with his city"""
    def __init__(self,name,city):
        self.name = name
        self.city = city
class PersonDisplay(QtWidgets.QMainWindow):
    def __init__(self, parent=None):
        super(PersonDisplay, self).__init__(parent)
        #QtWidgets.QMainWindow.__init__(self, parent)
        self.setWindowTitle('Person City')
        view = QtWidgets.QTableView()
        tableData = PersonTableModel()
        view.setModel(tableData)
        self.setCentralWidget(view)
        tableData.addPerson(Person('Ramesh', 'Delhi'))
        tableData.addPerson(Person('Suresh', 'Chennai'))
        tableData.addPerson(Person('Kiran', 'Bangalore'))

class PersonTableModel(QtCore.QAbstractTableModel):
    def __init__(self):
        super(PersonTableModel,self).__init__()
        self.headers = ['Name','City']
        self.persons  = ['Ramesh', 'Delhi']

    def rowCount(self,index=QtCore.QModelIndex()):
        return len(self.persons)

    def addPerson(self,person):
        self.beginResetModel()
        self.persons.append(person)
        self.endResetModel()

    def columnCount(self,index=QtCore.QModelIndex()):
        return len(self.headers)

    def data(self,index,role=QtCore.Qt.DisplayRole):
        col = index.column()
        person = self.persons[index.row()]
        if role == QtCore.Qt.DisplayRole:
            if col == 0:
                return QtWidgets.QVariant(person.name)
            elif col == 1:
                return QtWidgets.QVariant(person.city)
            return QtWidgets.QVariant()

    def headerData(self,section,orientation,role=QtCore.Qt.DisplayRole):
        if role != QtCore.Qt.DisplayRole:
            return QtWidgets.QVariant()

        if orientation == QtCore.Qt.Horizontal:
            return QtWidgets.QVariant(self.headers[section])
        return QtWidgets.QVariant(int(section + 1))

if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    appWin = PersonDisplay()
    appWin.show()
    sys.exit(app.exec_())

It seems correct but the run stops at: view.setModel(tableData). I don't know if this is due to my translation or code error. Any idea? Thanks

1

1 Answers

1
votes

1) QtWidgets.QVariant is raising an AttributeError because QVariant is under the QtCore package not QtWidgets.

2) in PyQt5 you don't need to use explicitly QVariant, so you can remove them completely.

3) in PersonTableModel.data(), person is a string and person.name and person.city will rise an error.

Here a fixed version of PersonTableModel:

class PersonTableModel(QtCore.QAbstractTableModel):
    def __init__(self):
        super(PersonTableModel,self).__init__()
        self.headers = ['Name','City']
        self.persons  = ['Ramesh', 'Delhi']

    def rowCount(self,index=QtCore.QModelIndex()):
        return len(self.persons)

    def addPerson(self,person):
        self.beginResetModel()
        self.persons.append(person)
        self.endResetModel()

    def columnCount(self,index=QtCore.QModelIndex()):
        return len(self.headers)

    def data(self,index,role=QtCore.Qt.DisplayRole):
        col = index.column()
        person = self.persons[index.row()]
        if role == QtCore.Qt.DisplayRole:
            if col == 0:
                return person
            elif col == 1:
                return person
            return None

    def headerData(self,section,orientation,role=QtCore.Qt.DisplayRole):
        if role != QtCore.Qt.DisplayRole:
            return None

        if orientation == QtCore.Qt.Horizontal:
            return self.headers[section]
        return int(section + 1)

P.S.

Your code is raising this exception:

Traceback (most recent call last):
  File "test.py", line 51, in headerData
    return QtWidgets.QVariant()
AttributeError: module 'PyQt5.QtWidgets' has no attribute 'QVariant'

it could have been useful to include that in the question