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

时间:2017-04-05 06:59:44

标签: c++ pyqt qt5 signals-slots python-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才能实现此目的。

也许一些提示:

如何在SIP中定义一个插槽作为参数的方法?

我认为这需要一些MethodCode我现在无法写作。 我想使用Qt5新的信号/插槽连接(避免在cpp方法中使用const char *slot,可能在python方法中加入一些MethodCode

1 个答案:

答案 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();
};