先创建一个工作类
class NvrWorker : public QObject { Q_OBJECT public: explicit NvrWorker(QObject *parent = NULL); virtual ~NvrWorker(); void setTcp(NVRSocket *socket); void dispatchRecvedMessage(tagVS_HEADER head, QByteArray m_dara); signals: void sig_RecvFileList(QList<FileInfo> listfile); void sig_DiskWring(); public slots: void slot_getfilelist();//处理耗时地方 private: bool mIsSend =false; QByteArray m_bytes; NVRSocket *m_socket; };
主线程ui界面类
pSocket = new NVRSocket; qDebug() << "main thread:" << QThread::currentThreadId(); m_NvrWorker = new NvrWorker();//不要传this m_NvrWorker->setTcp(pSocket); m_thread = new QThread(); m_NvrWorker->moveToThread(m_thread); connect(pSocket, &NVRSocket::readyRead,m_NvrWorker,&NvrWorker::slot_getfilelist); qRegisterMetaType<QList<FileInfo>>("QList<FileInfo>");//一定要注册 不注册收不到信号使用 qRegisterMetaType 注册自定义类型到元对象系统中主要作用为 QObject 的属性系统(信号槽)中使用该自定义类型。一般在第一次定义信号槽连接 connect 前进行注册,参数建议为同名字符串参数 connect(m_NvrWorker, &NvrWorker::sig_RecvFileList,this,&RecordingWidget::slot_RecvFileList);//可以不用写第五个参数,更不要写Qt::DirectConnection会卡死界面 connect(m_NvrWorker, &NvrWorker::sig_DiskWring,this,&RecordingWidget::slot_DiskWring); m_thread->start();