2017-04-05 1 views
1

j'ai une classe C++ défini avec un procédé qui présente un sol (pointeur de méthode de membre) comme argument:fente (pointeur à l'élément de procédé) comme argument de la méthode dans SIP

MyClass : public QDialog, private Ui::MyClassBase 
{ 
    Q_OBJECT 
    public: 
    MyClass(QWidget *parent = nullptr); 

    void connectValueChanged(const QList<QWidget *> &widgets, void (MyClass::*slot)()); 
} 

et

void MyClass::connectValueChanged(const QList<QWidget *> &widgets, void (MyClass::*slot)()) 
{ 
    Q_FOREACH (QWidget *widget, widgets) 
    { 
    connect(w, &QWidget::signal, this, slot); 
    } 
} 

le connectValueChanged ne peut pas être utilisé comme défini dans le fichier SIP, je reçois un erreur de syntaxe.


J'ai aussi essayé d'utiliser const char *slot sans succès: Dans le fichier SIP

void MyClass::connectValueChanged(const QList<QWidget *> &widgets, const char *slot); 

Je reçois une erreur (no matching function for call to ‘MyClass::connectValueChanged) que je suppose que je besoin d'MethodCode pour y parvenir.


Peut-être quelques conseils:


Que dois-je faire pour définir une méthode avec une fente comme argument dans SIP?

Je pense que cela nécessite quelques MethodCode Je ne suis pas capable d'écrire pour le moment. Je voudrais utiliser une nouvelle connexion signal/fente QT5 (évitez d'utiliser const char *slot dans la méthode cpp, mettre éventuellement dans la méthode python avec quelques MethodCode)

+0

Quelle est l'erreur que vous obtenez? Comment appelez-vous 'connectValueChanged'? – Svalorzen

+0

Je viens de mettre à jour la question avec l'erreur. –

+0

Pouvez-vous montrer la partie du code où vous appelez la fonction? – Svalorzen

Répondre

0

J'ai enlevé le pointeur à membre depuis que je ne suis pas Assurez-vous que cela est pris en charge pour le moment. Si vous utilisez la méthode signal/fente const char*, vous devez également implémenter les méthodes comme cela sinon vous obtiendrez bien sûr une erreur d'incompatibilité.

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

Le fichier SIP pourrait être quelque chose comme:

%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(); 
}; 
+0

Merci pour votre réponse. Je ne pouvais pas construire correctement cela. Si je garde la ligne 'using' dans le code sip, j'obtiens une erreur (' sip: using is undefined') et si je supprime la ligne, j'obtiens 'unknown VoidSlot'. Ai-je raté quelque chose, pourriez-vous découper le fichier sip aussi? À votre santé. –

+0

Je supposais que vous aviez accès à C++ 11, j'ai changé l'exemple avec un 'typedef' plutôt qu'un' using'. – Svalorzen

+0

Merci encore pour votre réponse. J'ai accès à C++ 11.Mon intention est d'utiliser la nouvelle connexion de slot de signal dans Qt5, d'où le pointeur vers l'argument de membre, que je voudrais garder. –