[PyQt] SIP 4.18.1 appears to be exposing private methods?
Shaheed Haque
srhaque at theiet.org
Thu Mar 9 07:10:38 GMT 2017
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?
Thanks, Shaheed
More information about the PyQt
mailing list