Qt____在信号和槽中使用自己定义的结构体____操作

来源:互联网 发布:js弹出div窗口 编辑:程序博客网 时间:2024/06/05 03:20

这个是我结合网上是资料,整理出来的两中方法, 参考过的网页: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_OBJECTpublic:    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();}





原创粉丝点击