插槽(指向方法成员的指针)作为 SIP 中方法的参数

Slot (pointer to method member) as argument to method in SIP

本文关键字:方法 作为 SIP 参数 指针 成员 插槽      更新时间:2023-10-16

我有一个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来实现这一点。


也许一些提示:

  • 现有的Qt方法但使用旧的信号/插槽连接。
  • SIP 扩展 API 要么。
  • static QMetaObject::fromSignal(返回QMetaObject(标头和定义

我该怎么做才能在 SIP 中定义一个带有插槽作为参数的方法?

我认为这需要一些MethodCode我现在无法写。我想使用 Qt5 新信号/插槽连接(避免在 cpp 方法中使用 const char *slot,可能放在 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 slotn";
}
...
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();
};