本文主要是介绍emit信号发送结构体,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
这个是我结合网上是资料,整理出来的两中方法, 参考过的网页:http://blog.chinaunix.net/uid-28235086-id-3427874.html
屏蔽的是第一种方法: 数据很少,可以定义多个形参,像串口接收过来的数据这样的,直接使用即可。
没有屏蔽的是第二种方法, 自己定义结构体,结合QVariant 来使用。
- #ifndef CCOMCTROL_H
- #define CCOMCTROL_H
- #include <QObject>
- #include <QTimer>
- typedef unsigned char u8_t;
- typedef unsigned short u16_t;
- #include <QMetaType>
- #include <QVariant>
- #pragma pack(push,1)
- typedef struct __comRcvData_s
- {
- u8_t len;
- u8_t *ptr;
- }comRcvData_s;
- #pragma pack(pop)
- Q_DECLARE_METATYPE(comRcvData_s)//这里很重要不能漏
- class CComCtrol : public QObject
- {
- Q_OBJECT
- public:
- explicit CComCtrol(QObject *parent = 0);
- ~CComCtrol();
- signals:
- // void rcvComData(const u8_t *data, int len);
- void rcvComData(QVariant dataVar);
- public slots:
- void TimeOutProc();
- private:
- QTimer time1;
- int cnt;
- };
- #endif // CCOMCTROL_H
- #ifndef CTESTDEFINESIGNAL_H
- #define CTESTDEFINESIGNAL_H
- #include <QtGui/QWidget>
- #include "ccomctrol.h"
- #include <QVariant>
- class CTestDefineSignal : public QWidget
- {
- Q_OBJECT
- public:
- CTestDefineSignal(QWidget *parent = 0);
- ~CTestDefineSignal();
- private slots:
- // void PrintRcvData(const u8_t *data,int len);
- void PrintRcvData(QVariant dataVar);
- private:
- CComCtrol *m_comCtrol;
- };
- #endif // CTESTDEFINESIGNAL_H
- #include "ccomctrol.h"
- CComCtrol::CComCtrol(QObject *parent) :
- QObject(parent)
- {
- comRcvData_s askData;
- QVariant DataVar;
- DataVar.setValue(askData);
- qRegisterMetaType<QVariant>("QVariant"); //写在构造函数里
- connect(&time1,SIGNAL(timeout()),this,SLOT(TimeOutProc()));
- time1.start(200);
- }
- CComCtrol::~CComCtrol()
- {
- }
- void CComCtrol::TimeOutProc()
- {
- comRcvData_s rcvData;
- u8_t buffer[10];
- rcvData.len=10;
- cnt+=10;
- for(int i=0;i<10;i++)
- {
- buffer[i]=cnt+i;
- }
- rcvData.ptr=buffer;
- QVariant var1;
- var1.setValue(rcvData); //设置发送的容器
- emit rcvComData(var1);
- ///time1.stop();
- }
- #include "ctestdefinesignal.h"
- #include <QDebug>
- CTestDefineSignal::CTestDefineSignal(QWidget *parent)
- : QWidget(parent)
- {
- m_comCtrol=new CComCtrol;
- // connect(m_comCtrol,SIGNAL(rcvComData(const u8_t *,int)),this,SLOT(PrintRcvData(const u8_t *,int)));
- connect(m_comCtrol,SIGNAL(rcvComData(QVariant)),this,SLOT(PrintRcvData(QVariant)));
- }
- CTestDefineSignal::~CTestDefineSignal()
- {
- }
- /*void CTestDefineSignal::PrintRcvData(const u8_t *data,int len)
- {
- qDebug()<<"CTestDefineSignal::data len:"<<len;
- for(int i=0;i<len;i++)
- {
- qDebug()<<data[i];
- }
- }
- */
- void CTestDefineSignal::PrintRcvData(QVariant dataVar)
- {
- comRcvData_s askData;
- askData = dataVar.value<comRcvData_s>();
- qDebug()<<"CTestDefineSignal::data len:"<<askData.len;
- for(int i=0;i<askData.len;i++)
- {
- qDebug()<<askData.ptr[i];
- }
- }
- #include <QtGui/QApplication>
- #include "ctestdefinesignal.h"
- #include "ccomctrol.h"
- #include <QVariant>
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- CTestDefineSignal w;
- w.show();
- return a.exec();
- }
这篇关于emit信号发送结构体的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!