How to debug: QAbstractTableModel subclass does not call flags()

Heads up! You've already completed this tutorial.

Otto_Hirr | 2021-04-07 15:18:58 UTC | #1

I have a subclass of QAbstractTableModel which correctly calls data() and setData() but does not call flags().

Since it is correctly calling data() & setData(), I presume the initialization should be correct for the QAbstractTableModel as a parent class of the object. I'm also using PyCharm, and it correctly shows an icon indicating which methods are being overridden.

I have another class with QAbstractTableModel as a parent class and it operates correctly. Debugging print statements flood the console in moving the mouse. So I presume something is up with the implementation of the other class.

The primary difference between the working/non-working classes is that the non-working class has multiple inheritance, defined as class A( B, QAbstractTableModel )

The other class has single inheritance as class C( QAbstractTableModel )

Since PyCharm seems to parse and identify overridden methods correctly and since the data() and setData() are working, I presume that initialization of the parent classes of A are correct.

Over 10,000 developers have bought Create GUI Applications with Python & Qt!
Create GUI Applications with Python & Qt6
Take a look

Downloadable ebook (PDF, ePub) & Complete Source code

Also available from Leanpub and Amazon Paperback

[[ discount.discount_pc ]]% OFF for the next [[ discount.duration ]] [[discount.description ]] with the code [[ discount.coupon_code ]]

Purchasing Power Parity

Developers in [[ country ]] get [[ discount.discount_pc ]]% OFF on all books & courses with code [[ discount.coupon_code ]]

Any suggestions on debugging would be appreciated.

Best regards, ..Otto


Otto_Hirr | 2021-04-07 15:22:38 UTC | #2

I'm guessing that a QLineEdit, accessing a class derived from QAbstractTableModel, using the QDataWidgetMapper, does not call the flags() method of the QAbstractTableModel.

The doc https://doc.qt.io/qt-5/modelview.html describes standard widgets and MV widgets and depicts under section 1.3 Overview of the Model/View Widgets.

It goes on to describe adapters, section 1.4 Using Adapters between Forms and Models, and references example widget QLineEdit.

I'm going to speculate that the QDataWidgetMapper will fetch and set data managed under QAbstractItemModel and the associated derived classes, eg QAbstractTableModel which I'm using, however the QDataWidgetMapper will not be making flags() calls to set the params of widgets, such as QLineEdit.

Any other thoughts?

..Otto


martin | 2021-04-07 15:29:31 UTC | #3

Hi @Otto_Hirr welcome to the forum & apologies for the delay in responding, I misses this when it first came in.

I think you've hit the nail on the head re: QLineEdit. The flags() are only really relevant to the model views which are designed to handle them. The flags are requested from the model when required by the view, but standard widgets have no mechanism to do this. The QDataWidgetMapper would be the place to look for this perhaps, as that does know about the flags mechanism and could feasibly apply changes to the widget (e.g. checkbox tristate).

Which flags were you hoping to apply to the QLineEdit, perhaps we can work something out.


Create GUI Applications with Python & Qt6 by Martin Fitzpatrick — (PySide6 Edition) The hands-on guide to making apps with Python — Over 10,000 copies sold!

More info Get the book

Well done, you've finished this tutorial! Mark As Complete
[[ user.completed.length ]] completed [[ user.streak+1 ]] day streak

How to debug: QAbstractTableModel subclass does not call flags() was written by Martin Fitzpatrick .

Martin Fitzpatrick has been developing Python/Qt apps for 8 years. Building desktop applications to make data-analysis tools more user-friendly, Python was the obvious choice. Starting with Tk, later moving to wxWidgets and finally adopting PyQt.