Короче говоря, я получаю следующую ошибку:
QObject::connect: Cannot queue arguments of type 'cv::Mat'
(Make sure 'cv::Mat' is registered using qRegisterMetaType().)
Я пытаюсь отправить сигнал, содержащий два изображения cv :: Mat из QThread, в основной поток, чтобы я моготобразить вывод.Нет ошибки времени компиляции, но когда я запускаю программу, она застревает в точке останова в qglobal.h (inline void qt_noop() {}
).
Я пытался добавить Q_DECLARE_METATYPE(cv::Mat)
к коду, чтобы нетпомогло.Я совершенно не понимаю, что делать сейчас.
код
В классе QThread:
signals:
void sndFlow(cv::Mat &leftEye, cv::Mat &rightEye);
void eyesDriver::run()
{
forever
{
flow->draw(leftEye, rightEye);
sndFlow(leftEye, rightEye);
}
}
Захват в классе QObject:
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);
}
В основном:
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();
}
Изменение переменных слота сигнала на QSharedPointer< cv::Mat >
также не работает.Выдает ту же ошибку:
QObject::connect: Cannot queue arguments of type 'QSharedPointer<cv::Mat>'
(Make sure 'QSharedPointer<cv::Mat>' is registered using qRegisterMetaType().)
РАБОТАЕТ
Ладно, похоже на работу.Я переехал qRegisterMetaType< cv::Mat >("cv::Mat");
прямо перед QObject::connect
вызовом.Однако мне все еще нужно «F5» после точки останова в qglobal.h, это работает потом.
Возможно, я ошибаюсь, но кажется, что расположение qRegisterMetaType
не тривиально.