[英]Slot (pointer to method member) as argument to method in 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 );
}
}
無法按照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
) 標頭和定義 如何在SIP中定義一個槽作為參數的方法?
我認為這需要一些我目前無法編寫的MethodCode
。 我想使用Qt5新的信號/插槽連接(避免在cpp方法中使用const char *slot
,可能在python方法中放入一些MethodCode
)
我已經刪除了指向成員的指針,因為我不確定此刻是否支持此指針。 如果你使用const char*
signal / slot方法,你還需要實現這樣的方法,否則你當然會得到一個不匹配的錯誤。
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();
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.