Seite 1 von 1

std::vector mit Signal übergeben

Verfasst: 7. Dezember 2008 18:03
von mase
Hallo!
Ich habe in meiner Klasse cMeasureThread folgendes Signal deklariert:

Code: Alles auswählen

    signals:
        void Graph_Changed(std::vector<unsigned> m_ElectrodeData, unsigned m_LowestElectrode, unsigned m_HighestElectrode);
Dann in der Klasse cDebugWindow (Objekt DebugWindow) so connected:

Code: Alles auswählen

 using std::vector;
...
   connect(m_MeasureThread, SIGNAL(Graph_Changed(vector<unsigned>, unsigned, unsigned)), SLOT(Graph_Changed(vector<unsigned>, unsigned, unsigned)));
Beim Starten des Programms erhalte ich die Meldung, dass es kein
solches Signal gibt:

Code: Alles auswählen

Object::connect: No such signal cMeasureThread::Graph_Changed(vector<uint>,uint,uint)
Object::connect:  (receiver name: 'DebugWindow')
Kann ich mit einem Signal keinen Vector übergeben?

Verfasst: 7. Dezember 2008 18:37
von upsala
Ich denke, daß moc von sich aus nicht mit Namespaces umgehen kann, also immer angeben oder nie...

Verfasst: 7. Dezember 2008 18:43
von -=Freaky=-
ja, das ganze funktioniert intern mit stringvergleichen, daher wird es wohl so sein, da hatte ich auch mal ein aehnliches problem mit ...

mfg,
julian

Verfasst: 7. Dezember 2008 18:46
von MiKla
Also ich habe es eben mit QVector probiert und damit geht es auch nicht, selber Fehler.
No such signal MainWindow::sendMessage(QVector<uint>)

Code: Alles auswählen

...
signals:
    void senMessage(QVector<unsigned>);

...
connect(this, SIGNAL(sendMessage(QVector<unsigned>)), this, SLOT(recvMessage(QVector<unsigned>)));
...
Michael

Verfasst: 7. Dezember 2008 18:48
von mase
Ich hab jetzt das std:: eingefügt. Die Meldung beim Programmstart ist
nun verschwunden. Doch nun ein neues Problem, wenn das Signal
gesendet werden soll:

Code: Alles auswählen

QObject::connect: Cannot queue arguments of type 'std::vector<uint>'
(Make sure 'std::vector<uint>' is registered using qRegisterMetaType().)
qRegisterMetaType ist für mich völlig neu, wie funktioniert das?
Oder soll ich versuchen, vorher einen QVector<unsigned> zu erstellen,
ihn mit dem Inhalt des std::vector füllen, und ihn zu übergeben?

Nachtrag: Mit QVector bekomm ich auch die Meldung mit
qRegisterMetaType.

Verfasst: 7. Dezember 2008 19:08
von upsala
Das steht sogar in der Doku von QObject::connect dabei...

Verfasst: 7. Dezember 2008 20:14
von mase
Jetzt hab ich

Code: Alles auswählen

qRegisterMetaType< std::vector<unsigned> >("std::vector<unsigned>");
eingefügt. Aber beim Kompilieren kommt der Fehler:

Code: Alles auswählen

measure_thread.h:38: error: too few template-parameter-lists
Das kann doch nicht so schwer sein, einen Vector zu übergeben.

Verfasst: 7. Dezember 2008 20:47
von mase
Ist mir noch nicht so ganz klar, aber jetzt geht es!
Ich hab

Code: Alles auswählen

qRegisterMetaType< std::vector<unsigned> >("std::vector<unsigned>");
in den Konstruktor von cMeasurementThread eingefügt.

Verfasst: 7. Dezember 2008 23:05
von Christian81
Warum überhaupt einen std::vector<> benutzen und nicht die Qt-Container? Zumal es ja from/toStdVector() gibt.

Verfasst: 8. Dezember 2008 14:29
von mase
Einen QVector hab ich auch schon probiert. Den muss ich auch
registrieren. Der Vector kommt aus einer nicht QT-Bibliothek, soll
nur von der GUI verarbeitet werden.
Ich sehe auf den ersten Blick auch keinen Sinn, warum es den
QVector überhaupt gibt. Ich sehe die selben Eigenschaften, wie beim
std::vector.

Verfasst: 8. Dezember 2008 15:55
von Christian81
QVector<> muss nicht registriert werden. Aber wenn es aus einer externen Lib kommt ist es so schon ok.