我有一个用一个方法定义的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 );
}
}
无法按照SIP文件中的定义使用connectValueChanged
,我收到 语法错误 。
我还尝试使用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
)header和definition 如何在SIP中定义一个插槽作为参数的方法?
我认为这需要一些MethodCode
我现在无法写作。
我想使用Qt5新的信号/插槽连接(避免在cpp方法中使用const char *slot
,可能在python方法中加入一些MethodCode
)
答案 0 :(得分:0)
我已删除指向成员的指针,因为我不确定此刻是否支持此指针。如果您使用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();
};