【发布时间】:2012-03-27 14:46:09
【问题描述】:
简而言之,我收到以下错误:
QObject::connect: Cannot queue arguments of type 'cv::Mat'
(Make sure 'cv::Mat' is registered using qRegisterMetaType().)
我想要做的是从 QThread 向主线程发送一个包含两个 cv::Mat 图像的信号,以便我可以显示输出。没有编译时错误,但是当我运行程序时,它卡在 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().)
作品
好吧,它似乎工作。我在QObject::connect 通话之前移动了qRegisterMetaType< cv::Mat >("cv::Mat");。但是我仍然必须在 qglobal.h 中的断点之后按“F5”,然后才能工作。
我可能是错的,但似乎qRegisterMetaType的位置不是微不足道的。
【问题讨论】:
-
老实说,我认为您可能无意中更改了其他内容,因为如果在第一次连接之前调用 qRegisterMetaType,我认为它并不重要。还是不是?
标签: qt opencv signals-slots qthread