Слот (указатель на член метода) в качестве аргумента метода в SIP

У меня есть класс C ++, определенный с методом, который имеет аргумент sol (указатель на метод-член):

MyClass : public QDialog, private Ui::MyClassBase
{
Q_OBJECT
public:
MyClass( QWidget *parent = nullptr );

void connectValueChanged( const QList<QWidget *> &widgets, void ( MyClass::*slot )() );
}

а также

 void MyClass::connectValueChanged( const QList<QWidget *> &widgets, void ( MyClass::*slot )() )
{
Q_FOREACH ( QWidget *widget, widgets )
{
connect( w, &QWidget::signal, this, slot );
}
}

connectValueChanged не может быть использован, как определено в файле SIP, я получаю ошибка синтаксиса.


Я также пытался использовать const char *slot безуспешно:
В файле SIP

void MyClass::connectValueChanged( const QList<QWidget *> &widgets, const char *slot);

Я получаю ошибку (no matching function for call to ‘MyClass::connectValueChanged) как я полагаю, мне нужно немного MethodCode для достижения этой цели.


Может быть, некоторые намеки:


Что я должен сделать, чтобы определить метод со слотом в качестве аргумента в SIP?

Я думаю, что это требует некоторых MethodCode Я не способен писать сейчас.
Я хотел бы использовать Qt5 новое соединение сигнал / слот (избегайте использования const char *slot в методе cpp, возможно, поместите в метод python с некоторыми MethodCode)

1

Решение

Я удалил указатель на член, так как не уверен, поддерживается ли это в данный момент. Если вы используете const char* Метод сигнал / слот, вам также необходимо реализовать такие методы, иначе вы, конечно, получите ошибку несоответствия.

class MyQObj : public QObject {
Q_OBJECT

public:
MyQObj(QObject * parent = nullptr);

void connectValueChanged(const QList<QObject*> &objects, const char * slot);

public slots:
void mySlot();
};

...

MyQObj::MyQObj(QObject * parent) : QObject(parent) {}

void MyQObj::connectValueChanged(const QList<QObject*> &objects, const char * slot) {
for (auto p : objects)
QObject::connect(p, SIGNAL(objectNameChanged(QString)), this, slot);
}

void MyQObj::mySlot() {
std::cout << "Called slot\n";
}

...

int main(int argc, char ** argv) {
QCoreApplication app(argc, argv);

MyQObj obj(&app);
QObject xxx(&app);

QList<QObject*> list;
list.push_back(&xxx);
obj.connectValueChanged(list, SLOT(mySlot()));

QTimer::singleShot(1000, [&xxx](){
xxx.setObjectName("newname");
});

return app.exec();
}

Файл SIP может быть что-то вроде:

%Module A

%Import QtCore/QtCoremod.sip

class MyQObj : public QObject
{
public:
MyQObj(QObject * parent /TransferThis/ = nullptr);

void connectValueChanged(const QList<QObject*> &objects, const char* slot);

public slots:
void mySlot();
};
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]