利用qt 信号槽传递自定义结构体--借助QVariant

在前面的博客里,我介绍了利用Q_DECLARE_METATYPE和qRegsterMetaType来传递自定义的结构体。但是这样做有个缺点:qRegisterMetaType()只能在main()函数里才能发挥作用。https://blog.csdn.net/Kelvin_Yan/article/details/70054282介绍了利用QVariant来传递自定义结构体的办法。有了这个办法,即使不在main()函数里调用qRegisterMetaType也能传递自定义数据。

建立一个工程,包含两个窗体:MainWindow和Emitter。两者通过信号sigVarnt()和槽OnRecvVarnt()传递QVariant,而QVariant实际上是一个自定义结构体。当MainWIndow::OnRecvVarnt()接收到信号之后,会将QVariant重新转化为结构体,并显示在界面上。

头文件:

#ifndef PROTOCOL_H
#define PROTOCOL_H

#include <QMetaType>

#pragma pack(push, 1)
#if !defined(DEF_ST_DUMMY)
typedef struct ST_DUMMY
{
    int i;
    float f;
    char arr[10];
} ST_DUMMY;

Q_DECLARE_METATYPE(ST_DUMMY)
#define DEF_ST_DUMMY
#endif

#pragma pack(pop)
#endif // PROTOCOL_H

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QVariant>
#include "emitter.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    Emitter         m_emitter;
public slots:
    void            OnRecvVarnt(QVariant);
private:
    Ui::MainWindow *ui;
};

#endif // MAINWINDOW_H
#ifndef EMITTER_H
#define EMITTER_H

#include <QWidget>
#include <QVariant>

class Emitter : public QWidget
{
    Q_OBJECT
public:
    explicit Emitter(QWidget *parent = 0);

signals:
    void     sigVarnt(QVariant);
public slots:
    void     OnTrigger(void);
};

#endif // EMITTER_H

cpp文件:

#include "emitter.h"
#include "protocol.h"

Emitter::Emitter(QWidget *parent) : QWidget(parent)
{

}

void Emitter::OnTrigger(void)
{
    ST_DUMMY stDummy;
    stDummy.i = 1;
    //char * p = "huii"
    memcpy(stDummy.arr, "abd", strlen("abd"));
    stDummy.f = 8.9;

    QVariant varnt;
    varnt.setValue(stDummy);
    emit sigVarnt(varnt);
}
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "protocol.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    connect(&m_emitter, SIGNAL(sigVarnt(QVariant)), this, SLOT(OnRecvVarnt(QVariant)));
    connect(ui->Btn, SIGNAL(clicked()), &m_emitter, SLOT(OnTrigger()));
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::OnRecvVarnt(QVariant vnrt)
{
    ST_DUMMY stDummy = vnrt.value<ST_DUMMY>();
    QString qstrMsg = QString("i = %1, f = %2, arr = %3").arg(stDummy.i, 10).arg(stDummy.f).arg(QString(stDummy.arr));
    ui->label->setText(qstrMsg);
}

效果:

点击pushubutton之后,界面上显示出了stDummy的三个成员的取值:

猜你喜欢

转载自blog.csdn.net/liji_digital/article/details/82904680