У меня есть класс 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
для достижения этой цели.
Может быть, некоторые намеки:
static QMetaObject::fromSignal
(возвращая QMetaObject
) заголовок а также определениеЧто я должен сделать, чтобы определить метод со слотом в качестве аргумента в SIP?
Я думаю, что это требует некоторых MethodCode
Я не способен писать сейчас.
Я хотел бы использовать Qt5 новое соединение сигнал / слот (избегайте использования const char *slot
в методе cpp, возможно, поместите в метод python с некоторыми MethodCode
)
Я удалил указатель на член, так как не уверен, поддерживается ли это в данный момент. Если вы используете 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();
};
Других решений пока нет …