插槽(指向方法成员的指针)作为 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&lt;QString, void (MyQObj::*)()&gt;

以上是关于插槽(指向方法成员的指针)作为 SIP 中方法的参数的主要内容,如果未能解决你的问题,请参考以下文章

C++指向对象成员的指针

C++指向对象成员的指针

这样做的正确方法是啥?调用指针到指针到指针中的函数?

通过“指向类成员的指针”访问作为数组的类成员

如何获得指向类的复制构造函数的成员函数指针?

C++基础之类和对象二