Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct
Access QTableView method from child class
hachbani last edited by hachbani
I'm using Pyside2, python 3.8.
For design, and other project specific purposes, I'm writing a class that does inherits from my MainWindow class, the class gets initialized with a excel file, I'm aiming with this class to parse my excel file and add data to MyTableView (which is connected to a proxy model).
I'm trying to access the MyTableView methods from the child class (AddFromFile), which seems to work, but in MyTableView, there's no rows added.
Below is my (minimal version) code. Hope it's clear enough.
class MainWindow(QtWidgets.QMainWindow, Ui_MainWindow): def __init__(self, parent=None): ProxyModel = ProxyModel() TableModel = TableModel() ProxyModel.setSourceModel(TableModel) MyTableView.setModel(ProxyModel) class AddFromFile(MainWindow): def __init__(self,File): super().__init__() self.MyTableView.model().sourceModel().addRow(['test data', 'column 1','column 2','column 3','column 4' ]) class TableModel(QtCore.QAbstractTableModel): def __init__(self, mlist=None): super(TableModel, self).__init__() self._items =  if mlist == None else mlist self._header =  def addRow(self, rowObject): row = self.rowCount() self.beginInsertRows(QtCore.QModelIndex(), row, row) self._items.append(rowObject) self.endInsertRows() self.layoutChanged.emit()
JonB last edited by
No idea, there's no information about what your
ProxyModeldoes/does not do.
You should put a
def addRow()to verify it's being called.
mlist == Noneis not good in Python.
Having a class named
AddFromFilewhich inherits from
MainWindow, and is responsible for something to do with having an Excel file. is not a good idea.
hachbani last edited by
ProxyModelis irrelevant to the problem, this is why I didn't include it in the minimal code, all what it does is filtering (QSortFilterProxyModel subclass).
I did add print() in def addRow(), it's indeed being called, I also called .rowCount() from the AddFromFIle class, to my surprise, it outputs 0, knowing that MyTableView is not empty.
I Think that calling MyTableView from child class, don't point to the same Table that is in the runnig MainWindow, instead, it goes look into a new Table in an I-don't-know-what MainWindow.
I've been trying to set up some sorts of signals/slots communication, no success..
I've implemented a function
def AddLine()in my
MainWindowclass, and call it from
super().AddLine(), it's been called (verified with a print in the function definition), but no line is been added to MyTableView.
Any idea how can I sort this out ?
JonB last edited by
Well, the ProxyModel is irrelevant to the problem
It isn't :) The table view is connected to the proxy, not the underlying table, so the proxy does 100% matter!
I Think that calling MyTableView from child class, don't point to the same Table that is in the runnig MainWindow,
From the code as shown,
AddFromFiledoes point to the
TableModelyou have in
Wait, hang on a sec!
MyTableView.setModel(ProxyModel). This is no good!
__init__()is just a local variable to the function Where is the
self.MyTableViewthat you will need to use??
AddFomFileis not the same as the
MyTableViewyou have in
hachbani last edited by
Here's the ProxyModel class, I still don't see how it's relevant to connecting the AddFromFile class to MainWIndow TableView.
class ProxyModel(QtCore.QSortFilterProxyModel): def __init__(self,parent=None): super(ProxyModel, self).__init__() self._filter = "Aucun" def setFilterColumn(self, header): if header == "Aucun": self.Filtre("Aucun") return True for col in range(self.sourceModel().columnCount()): if self.sourceModel().headerData(col) == header: self.setFilterKeyColumn(col) return True return False def Filtre(self, valeur): self._filter = str(valeur) self.invalidateFilter() def filterAcceptsRow(self, sourceRow, sourceParent): if self._filter == "Aucun": return True sourceModel = self.sourceModel() id = sourceModel.index(sourceRow, self.filterKeyColumn(), sourceParent) if sourceModel.data(id) == self._filter: return True return False
Now to the MYTableView part, I'm building my GUI interface using Qt Designer, then generate a .py code from the .ui file which I inherits in my MainWindow class, this is just me trying to reproduce a minimal code for the forum, it is indeed self.MyTableView.setModel(ProxyModel).
JonB last edited by JonB
I still don't see how it's relevant
So you have said before. Yet, for example, if you did not have the
self.invalidateFilter()you show that might have been an explanation.
just me trying to reproduce a minimal code for the forum, it is indeed self.MyTableView.setModel(ProxyModel).
Then it's not going to be possible to help you, if what you reproduce is not like your real code, as in this case. Best of luck finding someone who can help you from different code from your actual. I'll leave it to others.