[PyQt] SIP 4.18.1 appears to be exposing private methods?

Shaheed Haque srhaque at theiet.org
Thu Mar 9 07:10:38 GMT 2017


Hi,

I have come across some odd behaviour from SIP for a few of the files
I am generating such that SIP seems to be treating private methods as
if they were not private. For example, in one such case, the C++
header looks like this:

/usr/include/KF5/AkonadiCore/tagmodel.h
==============================
namespace Akonadi {
class TagModel: public QAbstractItemModel {
...
Q_SIGNALS:
    void populated();

private:
    bool insertRows(int row, int count, const QModelIndex &index =
QModelIndex()) Q_DECL_OVERRIDE;
    bool insertColumns(int column, int count, const QModelIndex &index
= QModelIndex()) Q_DECL_OVERRIDE;
    bool removeColumns(int column, int count, const QModelIndex &index
= QModelIndex()) Q_DECL_OVERRIDE;
    bool removeRows(int row, int count, const QModelIndex &index =
QModelIndex()) Q_DECL_OVERRIDE;
...
};
==============================

And the SIP file says:

==============================
namespace Akonadi {
class TagModel: QAbstractItemModel {
...
    Q_SIGNALS:
        void populated();
    private:
    private:
        // Generated for tagmodel.h, CLASS_DECL on line 36 'TagModel'
(by sip_generator.py:_container_get): non-copyable type handling
        TagModel(const Akonadi::TagModel &);
    };
};
==============================

Notice how the SIP does not contain the private member insertRows(),
e.g. after the populated() Q_SIGNAL. However, when I try to compile
the generated SIP, I see errors like this:

==============================
In file included from unifiedAkonadiCore.cpp:36:0:
tmp2/tmp/PyKF5/AkonadiCore/sipAkonadiCoreAkonadiTagModel.cpp: In
member function ‘virtual bool sipAkonadi_TagModel::insertRows(int,
int, const QModelIndex&)’:
tmp2/tmp/PyKF5/AkonadiCore/sipAkonadiCoreAkonadiTagModel.cpp:2564:54:
error: ‘virtual bool Akonadi::TagModel::insertRows(int, int, const
QModelIndex&)’ is private within this context
In file included from /usr/include/KF5/AkonadiCore/TagModel:1:0,
                 from tmp/AkonadiCore/TagModel.sip:28,
                 from unifiedAkonadiCore.cpp:8:
/usr/include/KF5/AkonadiCore/tagmodel.h:83:10: note: declared private here
     bool insertRows(int row, int count, const QModelIndex &index =
QModelIndex()) Q_DECL_OVERRIDE;
          ^~~~~~~~~~
===============================

And sure enough, the generated class sipAkonadi_TagMode has a
protected member for insertRows() in the section commented "There is a
protected method for every virtual method...". Have I missed something
or is this a known issue?

Thanks, Shaheed


More information about the PyQt mailing list