I am struggling with pyqt5 and hoping someone can guide me a bit. I have a class called Student. I want to display a few QTableView (read only) with only 3 columns that shows first_name, last_name and section.
Then, when the user selects 1 or more rows in the tableview and presses a button, I want to get the Student object that was used to create that row, and then use some of its other properties to do stuff.
My problem is that I can’t figure out how to get back to the actual Student object that was used to build the table. Here is some snippets of code I have…hoping someone can clue me in.
class Student: def __init__(self, section, last_name, first_name, email, sn_folder): self.section = section self.last_name = last_name self.first_name = first_name self.email = email self.SN_Folder = sn_folder def __str__(self): return self.full_name() def __repr__(self): return self.__str__() def full_name(self): return self.last_name + ", " + self.first_name class StudentTableModel(QtCore.QAbstractTableModel): # students is a list of Student objects. def __init__(self, students=None, parent=None): super(StudentTableModel, self).__init__(parent) if students is None: self.students =  else: self.students = students def rowCount(self, index=QtCore.QModelIndex()): """ Returns the number of rows the model holds. """ return len(self.students) def columnCount(self, index=QtCore.QModelIndex()): """ Returns the number of columns the model holds. """ return 5 def data(self, index, role=QtCore.Qt.DisplayRole): """ Depending on the index and role given, return data. If not returning data, return None (PySide equivalent of QT's "invalid QVariant"). """ if not index.isValid(): return None if not 0 <= index.row() < len(self.students): return None if role == QtCore.Qt.DisplayRole: last_name = self.students[index.row()].last_name first_name = self.students[index.row()].first_name section = self.students[index.row()].section email = self.students[index.row()].email sn_folder = self.students[index.row()].SN_Folder if index.column() == 0: return last_name elif index.column() == 1: return first_name elif index.column() == 2: return section elif index.column() == 3: return email elif index.column() == 4: return sn_folder return None
then in my mainwindow I have a method for the button being clicked:
def go_clicked(self): # Get a list of Student Objects ( was used to build the table) students = self.selected_course().students # Get selected row indices from the tableview row_indexes= for row in self.tblStudents2.selectionModel().selectedRows(): row_indexes.append(row.row()) # Attempt to retrieve the actual Student Object that corresponds to the row in the table # - this is wrong but it illustrates the idea. It works if I don't allow table to be sorted. for index in row_indexes: student = students[index] print(student)
Thanks in advance for any help you can provide!