Как послать сигнал Qt, содержащий cv::Mat?

Короче говоря, я получаю следующую ошибку:

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не является тривиальным.

9
задан Raf Berkvens 10 March 2012 в 14:22
поделиться