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

Phil Thompson phil at riverbankcomputing.com
Thu Mar 9 13:41:14 GMT 2017


On 09/03/2017 07:10, Shaheed Haque wrote:
> 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?

You need to add the private methods to the .sip file.

Phil


More information about the PyQt mailing list