In short, I get following error:
QObject::connect: Cannot queue arguments of type 'cv::Mat' (Make sure 'cv::Mat' is registered using qRegisterMetaType().)
What I'm trying to do is send a signal containing two cv::Mat images from a QThread to the main thread, so that I can display the output. There's no compile time error, but when I run the program, it gets stuck at a breakpoint in qglobal.h (inline void qt_noop() {}
).
I've tried to add Q_DECLARE_METATYPE(cv::Mat)
to the code, to no avail. I'm quite suck with what to do now.
code
In a QThread class:
signals: void sndFlow(cv::Mat &leftEye, cv::Mat &rightEye); void eyesDriver::run() { forever { flow->draw(leftEye, rightEye); sndFlow(leftEye, rightEye); } }
Capturing in a QObject class:
public slots: void recFlow(cv::Mat &leftEye, cv::Mat &rightEye); void myClass::recFlow(cv::Mat &leftEye, cv::Mat &rightEye) { cv::imshow("left", leftEye); cv::imshow("rigth", rightEye); cv::waitKey(40); }
In main:
Q_DECLARE_METATYPE(cv::Mat) int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qRegisterMetaType< cv::Mat >("cv::Mat"); // create objects from QThread and QObject class QObject::connect(&qthread, SIGNAL(sndFlow(cv::Mat&,cv::Mat&)), &qobject, SLOT(recFlow(cv::Mat&,cv::Mat&))); qthread.start(); return a.exec(); }
Changing the signal-slot variables to QSharedPointer< cv::Mat >
does not work either. Gives the same error:
QObject::connect: Cannot queue arguments of type 'QSharedPointer<cv::Mat>' (Make sure 'QSharedPointer<cv::Mat>' is registered using qRegisterMetaType().)
WORKS
All right, it seems to work. I've move qRegisterMetaType< cv::Mat >("cv::Mat");
right before the QObject::connect
call. However I still have to 'F5' past the breakpoint in qglobal.h, it works afterwards.
I might be wrong, but it seems that the location of qRegisterMetaType
is not trivial.