这是一个线程。
class MatThread : public QThread { Q_OBJECT public: MatThread(); ~MatThread(); void run(); void setrtspffmepg(RtspFfmpeg *rf){rtspffmpeg=rf;} void getmat(Mat *mat){this->mat = mat;} void showMat(); private slots: void setMat(const Mat &tmpMat); void MatThread::setMat(const Mat &tmpMat) { namedWindow("srcFrame"); imshow("srcFrame",tmpMat); waitKey(1); }
在这个类中发送信号代码如下。
signals: void SendImage(const QImage &image); void SendMat(const Mat &mat); emit SendMat(pCvMat);
在主界面中使用这个线程与类。代码如下
RtspFfmpeg *rtspffmpegmat=new RtspFfmpeg(this); rtspffmpegmat->SetUrl(ui->lineEdit_4->text()); MatThread *matthread=new MatThread(); if (rtspffmpegmat->Init()) { matthread->setrtspffmepg(rtspffmpegmat); matthread->start(); qRegisterMetaType< cv::Mat >("cv::Mat"); connect(rtspffmpegmat,SIGNAL(SendMat(Mat)),matthread,SLOT(setMat(Mat))); //matthread->showMat(); }
错误提示:
QObject::connect: Cannot queue arguments of type “Mat”
(Make sure “Mat” is registered using qRegisterMetaType().)
解决方案
200
线程中信号和槽函数的传递,参数是默认放到队列中去的,但是这个自定义的参数结构,不是QT自带的参数结构,不能识别。
解决方法有两种:
(1)将不识别的参数结构进行注册,让QT能够识别。
包含头文件:#include <QMetaType>
在构造的类的构造函数中调用其方法完成注册:qRegisterMetaType<Mat >(“Mat”);
(2)直接调用对方槽函数,不保存参数,直接传递。
connect时添加参数Qt::DirectConnection,以保证其不被放入信号队列,从而达到想要的效果
此种方法未测试,且官方认为这样做有风险,不推荐。
解决方法有两种:
(1)将不识别的参数结构进行注册,让QT能够识别。
包含头文件:#include <QMetaType>
在构造的类的构造函数中调用其方法完成注册:qRegisterMetaType<Mat >(“Mat”);
(2)直接调用对方槽函数,不保存参数,直接传递。
connect时添加参数Qt::DirectConnection,以保证其不被放入信号队列,从而达到想要的效果
此种方法未测试,且官方认为这样做有风险,不推荐。