[prev in list] [next in list] [prev in thread] [next in thread]
List: pykde
Subject: Re: [PyQt] SIP 4.18.1 appears to be exposing private methods?
From: Elvis Stansvik <elvstone () gmail ! com>
Date: 2017-03-10 17:22:47
Message-ID: CAHms=eY08Sq=qVAWyRobDgfL2dt+Zy7ebvWViub1SewKj-R=Bg () mail ! gmail ! com
[Download RAW message or body]
[Attachment #2 (multipart/alternative)]
Den 9 mars 2017 8:09 em skrev "Shaheed Haque" <srhaque@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@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@riverbankcomputing.com
> https://www.riverbankcomputing.com/mailman/listinfo/pyqt
[Attachment #5 (text/html)]
<p dir="ltr">Den 9 mars 2017 8:09 em skrev "Shaheed Haque" <<a \
href="mailto:srhaque@theiet.org">srhaque@theiet.org</a>>:<br> ><br>
> Yup, that fixed it. Thanks!</p>
<p dir="ltr">So please throw my ramblings in the garbage bin :)</p>
<p dir="ltr">Elvis</p>
<p dir="ltr">><br>
> For the record, it only seems to cause a problem when the base class<br>
> (the one exposing the public function) has virtual methods, which is<br>
> why most classes were not exhibiting the problem. But rather than rely<br>
> on this, I just turned all private methods on.<br>
><br>
> On 9 March 2017 at 13:41, Phil Thompson <<a \
href="mailto:phil@riverbankcomputing.com">phil@riverbankcomputing.com</a>> \
wrote:<br> > > On 09/03/2017 07:10, Shaheed Haque wrote:<br>
> >><br>
> >> Hi,<br>
> >><br>
> >> I have come across some odd behaviour from SIP for a few of the \
files<br> > >> I am generating such that SIP seems to be treating private \
methods as<br> > >> if they were not private. For example, in one such case, \
the C++<br> > >> header looks like this:<br>
> >><br>
> >> /usr/include/KF5/AkonadiCore/tagmodel.h<br>
> >> ==============================<br>
> >> namespace Akonadi {<br>
> >> class TagModel: public QAbstractItemModel {<br>
> >> ...<br>
> >> Q_SIGNALS:<br>
> >> void populated();<br>
> >><br>
> >> private:<br>
> >> bool insertRows(int row, int count, const QModelIndex &index \
=<br> > >> QModelIndex()) Q_DECL_OVERRIDE;<br>
> >> bool insertColumns(int column, int count, const QModelIndex \
&index<br> > >> = QModelIndex()) Q_DECL_OVERRIDE;<br>
> >> bool removeColumns(int column, int count, const QModelIndex \
&index<br> > >> = QModelIndex()) Q_DECL_OVERRIDE;<br>
> >> bool removeRows(int row, int count, const QModelIndex &index \
=<br> > >> QModelIndex()) Q_DECL_OVERRIDE;<br>
> >> ...<br>
> >> };<br>
> >> ==============================<br>
> >><br>
> >> And the SIP file says:<br>
> >><br>
> >> ==============================<br>
> >> namespace Akonadi {<br>
> >> class TagModel: QAbstractItemModel {<br>
> >> ...<br>
> >> Q_SIGNALS:<br>
> >> void populated();<br>
> >> private:<br>
> >> private:<br>
> >> // Generated for tagmodel.h, CLASS_DECL on line 36 \
'TagModel'<br> > >> (by sip_generator.py:_container_get): \
non-copyable type handling<br> > >> TagModel(const \
Akonadi::TagModel &);<br> > >> };<br>
> >> };<br>
> >> ==============================<br>
> >><br>
> >> Notice how the SIP does not contain the private member \
insertRows(),<br> > >> e.g. after the populated() Q_SIGNAL. However, when I \
try to compile<br> > >> the generated SIP, I see errors like this:<br>
> >><br>
> >> ==============================<br>
> >> In file included from unifiedAkonadiCore.cpp:36:0:<br>
> >> tmp2/tmp/PyKF5/AkonadiCore/sipAkonadiCoreAkonadiTagModel.cpp: In<br>
> >> member function ‘virtual bool \
sipAkonadi_TagModel::insertRows(int,<br> > >> int, const \
QModelIndex&)':<br> > >> \
tmp2/tmp/PyKF5/AkonadiCore/sipAkonadiCoreAkonadiTagModel.cpp:2564:54:<br> > \
>> error: ‘virtual bool Akonadi::TagModel::insertRows(int, int, const<br> \
> >> QModelIndex&)' is private within this context<br> > >> In \
file included from /usr/include/KF5/AkonadiCore/TagModel:1:0,<br> > >> \
from tmp/AkonadiCore/TagModel.sip:28,<br> > >> \
from unifiedAkonadiCore.cpp:8:<br> > >> \
/usr/include/KF5/AkonadiCore/tagmodel.h:83:10: note: declared private here<br> > \
>> bool insertRows(int row, int count, const QModelIndex &index \
=<br> > >> QModelIndex()) Q_DECL_OVERRIDE;<br>
> >> ^~~~~~~~~~<br>
> >> ===============================<br>
> >><br>
> >> And sure enough, the generated class sipAkonadi_TagMode has a<br>
> >> protected member for insertRows() in the section commented "There \
is a<br> > >> protected method for every virtual method...". Have I \
missed something<br> > >> or is this a known issue?<br>
> ><br>
> ><br>
> > You need to add the private methods to the .sip file.<br>
> ><br>
> > Phil<br>
> _______________________________________________<br>
> PyQt mailing list <a \
href="mailto:PyQt@riverbankcomputing.com">PyQt@riverbankcomputing.com</a><br> > <a \
href="https://www.riverbankcomputing.com/mailman/listinfo/pyqt">https://www.riverbankcomputing.com/mailman/listinfo/pyqt</a><br></p>
[Attachment #6 (text/plain)]
_______________________________________________
PyQt mailing list PyQt@riverbankcomputing.com
https://www.riverbankcomputing.com/mailman/listinfo/pyqt
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic