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

Shaheed Haque srhaque at theiet.org
Thu Mar 9 19:08:20 GMT 2017


Yup, that fixed it. Thanks!

For the record, it only seems to cause a problem when the base class
(the one exposing the public function) has virtual methods, which is
why most classes were not exhibiting the problem. But rather than rely
on this, I just turned all private methods on.

On 9 March 2017 at 13:41, Phil Thompson <phil at riverbankcomputing.com> wrote:
> 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