Q_DECLARE_METATYPE()和qRegisterMetaType基本使用方法(5.12)


//for starf study

#include "mainwindow.h"
#include "ui_mainwindow.h"

#include<QDebug>
#include<QMetaType>
#include <QString>
#include <QVariant>

//QMetaType类管理元对象系统中的命名类型。
//该类用作QVariant、排队信号和插槽连接中marshall类型的助手
//使用 Q_DECLARE_METATYPE()声明新类型,使它们可用于QVariant和其他基于模板的函数。
//qRegisterMetaType()使类型可用于非基于模板的函数,例如排队信号和插槽连接。

/*
enum QMetaType::Type{
    QMetaType::Void,
    QMetaType::Bool,
    QMetaType::Int,
    QMetaType::UInt,
    ...
    QMetaType::QString,
    QMetaType::QByteArray,
    ...
    QMetaType::QObjectStar,
    QMetaType::QVariant,
    ...
    QMetaType::QPen,
    ...
    QMetaType::QPixmap,
    ...
    QMetaType::User,
    QMetaType::UnknownType
}
*/
//QMetaType 默认管理这个枚举类型,里面有默认的类型


//typedef struct MyCustomStructStruct{
//    QString name;
//    int age;
//}MyCustomStruct;

Q_DECLARE_METATYPE(MyCustomStruct)   //将自定义数据结构注册到QMetaType


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    MyCustomStruct cs;
    cs.age = 24;
    cs.name = "starf";
    QVariant v;
    v.setValue(cs);  // 可以让QVariant 识别自定义类型
                             // 也可以是自定义calss 或者自定义 namespace

 MyCustomStruct cp = v.value<MyCustomStruct>();
 qDebug()<< cp.name;   //"starf"

 qRegisterMetaType<MyCustomStruct>("MyCustomStruct");  //注册类型
connect(this,SIGNAL(send_test_signal(MyCustomStruct)), this, SLOT(get_test_signal(MyCustomStruct)), Qt::QueuedConnection);
        //需要在槽函数中使用自定义类型或者类 首先需要使用Q_DECLARE_METATYPE 注册类型
        // 如果需要跨线程传递自定义类型或者类 就还需要使用qRegisterMetaType 注册
        //如果只是在本线程中使用,那么可以不用 qRegisterMetaType

}

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

void MainWindow::get_test_signal(MyCustomStruct s)
{
    qDebug()<<s.name<<s.age;
}

void MainWindow::on_pushButton_clicked()
{
    MyCustomStruct cs;
    cs.name = "fox";
    cs.age = 23;

    emit send_test_signal(cs);
}


  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值