2016-05-12 11 views
1

Gibt es eine Beschränkung der Anzahl der Parameter von Signalen?Kein passender Anruf zum Verbinden - wenn ich 7 Parameter einstelle. funktioniert gut mit 6 Parametern

Im folgenden Code reduzieren Sie einfach 1 Parameter auf den Signalsteckplatz und arbeiten und der Fehler verschwindet.

Wie ist das siebte Argument zu übergeben?

Reproduzierbare Beispiel:

#ifndef JJJJ 
#define JJJJ 
#include <QQuickItem> 
#include <QDebug> 
#include <QThread> 


class Worker : public QObject 
{ 
    Q_OBJECT 

public: 
    Worker() { } 

public slots: 
    void doWork (int one, int b, int c, int d, int e, int f, int h) 
    { 
     emit resultReady(""); 
    } 

signals: 
    void resultReady(const QString &result); 
}; 

class Controller : public QObject 
{ 
    Q_OBJECT 

    QThread workerThread; 

public: 
    Controller() { 
     Worker *worker = new Worker; 

     connect (&workerThread, &QThread::finished, worker, &QObject::deleteLater); 
     connect (this, &Controller::operate, worker, &Worker::doWork); 
     connect (worker, &Worker::resultReady, this, &Controller::handleResults); 
     worker->moveToThread(&workerThread); 

     workerThread.start(); 
    } 

    ~Controller() { 
     workerThread.quit(); 
     workerThread.wait(); 
    } 

public slots: 
    void handleResults(const QString &) {} 

signals: 
    void operate(int, int, int,int,int,int, int); 
}; 
#endif // JJJJ 
+6

Von [Dokumentation] (http://doc.qt.io/qt-5/signalsandslots.html#signals-and-slots-with-default-arguments): "Beachten Sie, dass diese Syntax nur funktioniert, wenn das Signal und der Slot 6 oder weniger Argumente haben, wenn Ihr Compiler keine variantenbasierten C++ 11-Vorlagen unterstützt." Sie können stattdessen die SIGNAL- und SLOT-Makros verwenden, die intern Strings erstellen. –

+0

Setzen Sie diese Variablen in eine Struktur oder eine Klasse und übergeben Sie diese stattdessen. – thuga

+0

@KarstenKoop sehr dankbar. –

Antwort

4

Nach den documentation, sind Sie mit sechs Argumenten, um Anrufe oder weniger begrenzt mit neuem Stil Syntax, wenn Ihr Compiler variadische Vorlage Signaturen unterstützt. Eine schnelle Lösung besteht darin, einen Containertyp zu erstellen und ihn mit QMetaType unter Verwendung von Q_DECLARE_METATYPE und qRegisterMetaType zu registrieren.

zunächst den Datentyp deklarieren:

//foo.h 
#include <QMetaType> 

struct Foo 
{ 
    int one, b, c, d, e, f, h; 
} 
Q_DECLARE_METATYPE(Foo) 

Da Sie Threads verwenden, die Warteschlange Signale bedeutet, Sie müssen auch mit qRegisterMetaType, in der Regel in main oder eine Funktion zur Initialisierung der Metatyp zur Laufzeit registrieren, die nur einmal genannt:

//main.cpp 
#include <QApplication> 
#include <QMetaType> 
#include "foo.h" 

int main(...) 
{ 
    QApplication app(argc, argv); 
    qRegisterMetaType<Foo>(); 
    ... //do more things here 
    return app.exec() 
} 

Sie sollten nun in der Lage sein Foo in der Signal- und Slot-Verbindungen zu verwenden, ohne Frage die folgenden für Ihr Signal und Schlitz Signaturen:

void doWork(Foo foo); 

und

void operate(Foo); 
+0

P.S. Kudos bei der richtigen Verwendung von QThread anstelle von Unterklassen. Ich glaube nicht, dass Anti-Pattern jemals verschwinden wird. –