Domanda

In breve, ho il seguente errore:

QObject::connect: Cannot queue arguments of type 'cv::Mat'
(Make sure 'cv::Mat' is registered using qRegisterMetaType().)

Quello che sto cercando di fare è inviare un segnale contenente due curriculum::Stuoia di immagini da un QThread al thread principale, in modo che io possa visualizzare l'output.Non c'è nessun errore di fase di compilazione, ma quando ho eseguito il programma, si ottiene bloccato in un punto di interruzione in qglobal.h (inline void qt_noop() {}).

Ho provato ad aggiungere Q_DECLARE_METATYPE(cv::Mat) per il codice, senza alcun risultato.Sono abbastanza schifo con che cosa fare ora.

codice

In un QThread classe:

signals:
void sndFlow(cv::Mat &leftEye, cv::Mat &rightEye);

void eyesDriver::run()
{
    forever
    {
        flow->draw(leftEye, rightEye);
        sndFlow(leftEye, rightEye);
    }
}

La cattura in un QObject classe:

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);
}

Nel 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();
}

Modificare il segnale slot variabili QSharedPointer< cv::Mat > non funziona neanche.Dà lo stesso errore:

QObject::connect: Cannot queue arguments of type 'QSharedPointer<cv::Mat>'
(Make sure 'QSharedPointer<cv::Mat>' is registered using qRegisterMetaType().)

FUNZIONA

Bene, sembra funzionare.Ho spostare qRegisterMetaType< cv::Mat >("cv::Mat"); a destra prima del QObject::connect chiamata.Tuttavia devo ancora 'F5' passato il punto di interruzione in qglobal.h, funziona dopo.

Posso sbagliarmi, ma sembra che la posizione di qRegisterMetaType non è banale.

È stato utile?

Soluzione

È necessario chiamare qRegisterMetaType oltre alla macro (o in sostituzione di esso, a seconda delle vostre esigenze).Questo è necessario per i segnali di essere in grado di maresciallo dei dati tra thread.Tuttavia, potrebbe essere una saggia idea di passare per riferimento o puntatore intelligente, o raw puntatore se stai usando il QObject gerarchia di gestire il ciclo di vita degli oggetti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top