QObject::connect: Cannot queue arguments of type
-
(int e, float a[], float b[]);
gives
QObject::connect: Cannot queue arguments of type 'float[]' (Make sure 'float[]' is registered using qRegisterMetaType().)
(int e, qfloat16 a[], qfloat16 b[]);
gives
QObject::connect: Cannot queue arguments of type 'qfloat16[]' (Make sure 'qfloat16[]' is registered using qRegisterMetaType().)
i want to pass a float array from one thread to another. neither float works. does qt not have a standard float array to pass?
edit: guess i should have add more code, although more does not seem to explain error.
class COnesignals: void EmitScene(int i, QList<qfloat16> a, QList<qfloat16> b);
int end; QList<qfloat16> A; QList<qfloat16> B; emit EmitScene(end, sceneA, sceneB);
class connect1to2
connect(m_one, &COne::EmitScene, m_two, &CTwo::ReceiveScene);
class CTwo
void CTwo::ReceiveScene(int e, QList<qfloat16> a, QList<qfloat16> b)
-
in .h file, but only in one .h file
Q_DECLARE_METATYPE(QList<qfloat16>) //data int id;
in .cpp file, constructor
id = qRegisterMetaType< QList<qfloat16> >();
-
@micha_eleric I suggest you to use a qt container rather than an array. and that will be work.
Such as QList<float>.
Because Qt have to store the args when you use queued connection type. -
@HaoTian I get
QObject::connect: Cannot queue arguments of type 'QList<float>' (Make sure 'QList<float>' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'QList<qfloat16>' (Make sure 'QList<qfloat16>' is registered using qRegisterMetaType().)
seems same issue
-
@micha_eleric The message will continue until you do what the error message advises and call qRegisterMetaType:
int id = qRegisterMetaType< QList<float> >();
somewhere early in the code execution before you try to use it.
-
@micha_eleric No no, it's not necessary to register anything. because QList is automatically registered by Qt and basic types do not need to be registered either.
-
@HaoTian Indeed, you are correct. This, for example, works:
#include <QCoreApplication> #include <QObject> #include <QList> #include <QDebug> #include <QTimer> class Object: public QObject { Q_OBJECT public: Object(QObject *p = nullptr): QObject(p) { QTimer::singleShot( 5000, this, [this]() { emit send(QList<float> { 0, 1.2, 2.3, 3.4 } ); } ); }; ~Object() { } public slots: void receive(QList<float> list) { qDebug() << list; } signals: void send(QList<float> list); }; int main(int argc, char **argv) { QCoreApplication app(argc, argv); Object *a = new Object(qApp); Object *b = new Object(qApp); QObject::connect(a, &Object::send, b, &Object::receive); return app.exec(); } #include "main.moc"
So, @micha_eleric, what are you not telling us? Are there threads involved? Can you modify the example above to fail in the same way?
-
@micha_eleric
First you should get your code compiling and running correctly as per @ChrisW67. You will need to use theQ_OBJECT
macro., and you should useconnect()
syntax shown, notSIGNAL
/SLOT()
macros.But you may end up needing to reconsider your array/list arguments to the signal/slot. I assume you are signalling across threads. Qt will copy any arguments. If your array is "large" or if you intend to update the array in the slot (not just read from it) you may/will need to reconsider.
-
@ChrisW67 said in QObject::connect: Cannot queue arguments of type:
@HaoTian Indeed, you are correct. This, for example, works:
#include <QCoreApplication> #include <QObject> #include <QList> #include <QDebug> #include <QTimer> class Object: public QObject { Q_OBJECT public: Object(QObject *p = nullptr): QObject(p) { QTimer::singleShot( 5000, this, [this]() { emit send(QList<float> { 0, 1.2, 2.3, 3.4 } ); } ); }; ~Object() { } public slots: void receive(QList<float> list) { qDebug() << list; } signals: void send(QList<float> list); }; int main(int argc, char **argv) { QCoreApplication app(argc, argv); Object *a = new Object(qApp); Object *b = new Object(qApp); QObject::connect(a, &Object::send, b, &Object::receive); return app.exec(); } #include "main.moc"
So, @micha_eleric, what are you not telling us? Are there threads involved? Can you modify the example above to fail in the same way?
If I may just add something: use const references, this will avoid potentially expensive copies when possible.
-
@JonB said in QObject::connect: Cannot queue arguments of type:
@micha_eleric
First you should get your code compiling and running correctly as per @ChrisW67. You will need to use theQ_OBJECT
macro., and you should useconnect()
syntax shown, notSIGNAL
/SLOT()
macros.But you may end up needing to reconsider your array/list arguments to the signal/slot. I assume you are signalling across threads. Qt will copy any arguments. If your array is "large" or if you intend to update the array in the slot (not just read from it) you may/will need to reconsider.
it compiles and runs, but
QObject::connect: Cannot queue arguments of type 'QList<float>' (Make sure 'QList<float>' is registered using qRegisterMetaType().)
shows on console while running
-
@micha_eleric Which version of Qt are you running ?
-
@SGaist said in QObject::connect: Cannot queue arguments of type:
@micha_eleric Which version of Qt are you running ?
been asked this before, and still no clue how to find out. All I can find is the version of the editor.
-
-
@Abderrahmene_Rayene said in QObject::connect: Cannot queue arguments of type:
@micha_eleric said in QObject::connect: Cannot queue arguments of type:
how to find out
instructions do not work for my version of QT Create, and once i did find preference->kit->kit, nothing was listed under auto-detected nor manual
-
@micha_eleric said in QObject::connect: Cannot queue arguments of type:
once i did find preference->kit->kit, nothing was listed under auto-detected nor manual
That sounds very strange.
What do you see when you try Step #2 in the instructions?
-
@JKSH said in QObject::connect: Cannot queue arguments of type:
@micha_eleric said in QObject::connect: Cannot queue arguments of type:
once i did find preference->kit->kit, nothing was listed under auto-detected nor manual
That sounds very strange.
What do you see when you try Step #2 in the instructions?
lol, second step also gave no version, but can find editor version elsewhere
Qt Creator 6.0.2
Based on Qt 5.15.3 (GCC 11.2.0, 64 bit) -
@micha_eleric said in QObject::connect: Cannot queue arguments of type:
Qt Creator 6.0.2
Based on Qt 5.15.3 (GCC 11.2.0, 64 bit)This is meaningless. It's the Qt version which was used to build your QtCreator version.
How are your build folders named? In some case they are named by default like:
build_<Projectname>_<QtX_X_X>_<Compiler>_<Architecture>
There you also can find out what Qt version you are using
-
@Pl45m4 said in QObject::connect: Cannot queue arguments of type:
@micha_eleric said in QObject::connect: Cannot queue arguments of type:
Qt Creator 6.0.2
Based on Qt 5.15.3 (GCC 11.2.0, 64 bit)This is meaningless. It's the Qt version which was used to build your QtCreator version.
How are your build folders named? In some case they are named by default like:
build_<Projectname>_<QtX_X_X>_<Compiler>_<Architecture>
There you also can find out what Qt version you are using
again nothing of use, "build-GraphicsView-Desktop-Debug"