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

Elvis Stansvik elvstone at gmail.com
Fri Mar 10 17:22:47 GMT 2017


Den 9 mars 2017 8:09 em skrev "Shaheed Haque" <srhaque at theiet.org>:
>
> Yup, that fixed it. Thanks!

So please throw my ramblings in the garbage bin :)

Elvis

>
> 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
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> https://www.riverbankcomputing.com/mailman/listinfo/pyqt
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20170310/bd2bed2e/attachment.html>


More information about the PyQt mailing list