插槽(指向方法成员的指针)作为 SIP 中方法的参数
Posted
技术标签:
【中文标题】插槽(指向方法成员的指针)作为 SIP 中方法的参数【英文标题】:Slot (pointer to method member) as argument to method in SIP 【发布时间】:2017-08-30 15:26:53 【问题描述】:我有一个 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
来实现这一点。
也许有一些提示:
existing Qt method 但使用旧的信号/插槽连接。 SIP extension API 要么。static QMetaObject::fromSignal
(返回 QMetaObject
)header 和 definition
如何在 SIP 中定义一个以槽为参数的方法?
我认为这需要一些MethodCode
我目前无法编写。
我想使用Qt5新的信号/插槽连接(避免在cpp方法中使用const char *slot
,可能在python方法中使用一些MethodCode
)
【问题讨论】:
你得到什么错误?你怎么打电话给connectValueChanged
?
我刚刚用错误更新了问题。
你能显示你调用函数的实际代码吗?
您可能以错误的方式调用该函数,请查看我的示例并展示您的不同之处。
【参考方案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();
;
【讨论】:
感谢您的回复。我无法正确构建它。如果我在 sip 代码中保留using
行,我会收到一个错误 (sip: using is undefined
),如果我删除该行,我会收到 unknown VoidSlot
。我错过了什么吗,你能不能把 sip 文件也删掉?干杯。
我假设您可以访问 c++11,我已将示例更改为 typedef
而不是 using
。
再次感谢您的回复。我确实可以访问 c++11。我的意图是在 Qt5 中使用新的信号槽连接,因此我想保留指向成员参数的指针。
我只是想知道是否无法使用某些方法代码将const char *slot
转换为指向方法成员的指针。干杯。
@DenisRouzaud 我想sip
不支持指向成员的指针。理想情况下,您可以导出const char*
版本并使用它来调用指向成员方法的指针。您可以将 const char*
转换为指针成员,并适当初始化 static const QHash<QString, void (MyQObj::*)()>
。以上是关于插槽(指向方法成员的指针)作为 SIP 中方法的参数的主要内容,如果未能解决你的问题,请参考以下文章