qt下线程的通讯问题?各位来看看这是怎么回事

C++语言 码拜 8年前 (2016-04-22) 1393次浏览
这是一个线程。

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,以保证其不被放入信号队列,从而达到想要的效果
此种方法未测试,且官方认为这样做有风险,不推荐。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明qt下线程的通讯问题?各位来看看这是怎么回事
喜欢 (0)
[1034331897@qq.com]
分享 (0)