[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