Qt中以qRegister开头的几个函数的用法说明

目录

1. 前言

2. qRegisterMetaTypeStreamOperators

    2.1. 函数功能简述

    2.2.用法举例1

3. qRegisterMetaType


1. 前言

        Qt通过qRegister开头的函数和Q_DECLARE开头的几个宏向Qt元系统注册、声明一些非基本类型。一旦声明、注册后,在Qt元系统中就可以很方便的利用这些非基本类型,这样对编程中的数据交互很方便。非基本类型是指除了一些基本类型之外的类型,如:除了int、float、qint......之外的类型,如:自定义类、结构体、枚举等。

         有关Q_DECLARE开头的几个宏的用法说明,请参见如下博文:

         《Qt中以Q_DECLARE开头的几个宏的用法说明》

2. qRegisterMetaTypeStreamOperators

    2.1. 函数功能简述

该函数如下:

template <typename T>
void qRegisterMetaTypeStreamOperators(const char *typeName)

在Qt Assisant中省略了前面的模板声明关键字。这个函数为类型为T,名称为typeName(即参数)向Qt元系统注册流操作,之后,类型T就能用 如下函数执行流相关的操作:

static] bool QMetaType::load(QDataStream &stream, int type, void *data)
bool QMetaType::save(QDataStream &stream, int type, const void *data)

当流化一个QVariant对象时,常常会用到这个函数。如下:

qRegisterMetaTypeStreamOperators<MyClass>("MyClass");

流操作应实现如下的函数,否则编译会报错:

  QDataStream &operator<<(QDataStream &out, const MyClass &myObj);
  QDataStream &operator>>(QDataStream &in, MyClass &myObj);

    2.2.用法举例1

#include <QtCore/QCoreApplication>
#include<QVariant>
#include<QDataStream>
#include <QBuffer> 
class CMyObj : public QObject
{
public:
    CMyObj()
    {
        m = 888;
    }
    ~CMyObj()
    {
        
    }
    CMyObj(const CMyObj& obj)
    {
        m = obj.m;
    }

    int getM() const
    {
        return m;
    }

    void setM(int nMy_m)
    {
        m = nMy_m;
    }
private:
    int m;
};

Q_DECLARE_METATYPE(CMyObj);

QDataStream& operator<< (QDataStream& stream, const CMyObj& myObj)
{
    auto m = myObj.getM();
    stream << m;
    return stream;
}
QDataStream& operator>> (QDataStream& stream, CMyObj& myObj)
{
    int m;
    stream >> m;
    myObj.setM(m);

    return stream;
}

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    // 对CMyObj类注册流化操作
    qRegisterMetaTypeStreamOperators<CMyObj>("CMyObj");

  /*  CMyObj saveMyObj;
    QVariant varSave;
    varSave.setValue(saveMyObj);
    
    QFile file("file.dat");
    file.open(QIODevice::WriteOnly);
    QDataStream streamForSaveMyObj(&file); 
    streamForSaveMyObj << varSave;
    file.close();

    file.open(QIODevice::ReadOnly);
    QVariant varLoad;
    streamForSaveMyObj >> varLoad;
    auto k = varLoad.value<CMyObj>();
    auto m = k.getM();
    file.close();*/

    CMyObj saveMyObj;
    QVariant varSave;

    // 将CMyObj类的saveMyObj对象保存到QVariant,注意:需要用Q_DECLARE_METATYPE声明,否则编译会报错
    varSave.setValue(saveMyObj); 

    QBuffer buf;
    QDataStream streamForSaveMyObj(&buf);
    buf.open(QIODevice::WriteOnly);
    streamForSaveMyObj << varSave;  // 将QVariant保存到流,QBuffer你可以认为是一段内存。将其保存到一段内存中。
    buf.close();

    buf.open(QIODevice::ReadOnly);
    QVariant varLoad;
    streamForSaveMyObj >> varLoad;   // 将原先保存到内存的流中的QVariant对象取出来
    buf.close();

    auto loadMyObj = varLoad.value<CMyObj>(); // 从QVariant对象中恢复出原先的CMyObj类对象
    auto m = loadMyObj.getM(); // 输出888

    return a.exec();
}

说明:

  • 当将一个自定义的类,进行流化操作时,必须用qRegisterMetaTypeStreamOperators进行声明,否则编译会报错。如下:
  • 当将自定义的类对象保存到QVariant对象时,需要先用 用Q_DECLARE_METATYPE声明,否则编译会报错。具体参见:Qt中以Q_DECLARE开头的几个宏的用法说明
  • 上面的代码将一个自定义的对象通过流保存到QBuffer对象中。QBuffer对象可以认为是内存中的一块区域。也可以像注释掉的那块代码那样保存到文件。
  • 上面代码将自定义对象写入流和从流读取出来放到main的同一个函数。实际开发中,可以利用类的成员变量进行跨函数数据交互,如:在类的A成员函数中将自定义对象写入流(该流是类的成员变量);然后在类的B成员函数中再将该自定义对象从流中读出来,这样可以方便数据的交互。

3. qRegisterMetaType

这个参见Qt assist,在此不再详述。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Qt的connect函数有四个参数,分别是: sender,signal,receiver,slot。sender是发送信号的对象;signal是信号;receiver是接收信号的对象;slot是接收的槽函数,用来处理接收到的信号。 ### 回答2: 在Qt中,connect函数有5个参数,具体功能如下: 1. sender:信号发送者的对象指针。当发送者发出信号时,connect函数将建立信号与槽之间的连接。 2. signal:信号的函数指针。信号是一个在特定条件下被发送的函数,当发送者满足该条件时,会通过该信号通知其他接收者。 3. receiver:信号接收者的对象指针。当信号被发送时,它将由接收者的槽函数处理。 4. slot:槽函数函数指针。槽是可以处理信号的函数,当接收者收到信号时,将执行该槽函数进行相应的处理。 5. type:连接类型,用来指定信号与槽之间的连接方式。连接类型包括: - Qt::DirectConnection:直接连接,信号发送后立即执行槽函数。 - Qt::QueuedConnection:队列连接,信号发送后,将信号加入到接收者对象所在的事件队列中,然后再执行槽函数。 - Qt::AutoConnection:自动连接,连接类型由Qt来确定。当信号发送者和接收者在同一线程中时,使用直接连接,否则使用队列连接。 这些参数共同构成了Qt中信号与槽的机制,通过connect函数可以建立和管理信号与槽之间的连接,实现不同对象之间的交互和通信。 ### 回答3: 在Qt中,connect函数几个参数。connect函数主要用来建立信号和槽之间的连接。connect函数的基本语法为: connect(sender, signal, receiver, slot, connectionType) 其中,connect函数有五个参数,分别是: 1. sender:信号的发送者对象,即产生信号的对象。 2. signal:发送者对象发出的信号。信号与函数的关联通常在头文件的signals部分声明。 3. receiver:信号的接收者对象,即接收信号的对象。 4. slot:接收者对象接收信号时调用的槽函数。槽函数需要在头文件的slots部分声明,并在相应的实现文件中定义。 5. connectionType:连接类型,用于指定信号和槽之间的连接规则。 其中,sender和receiver参数可以是QObject对象或QPointer<QObject>对象。signal和slot参数需要使用SIGNAL()和SLOT()宏将函数名转换为字符串。 通过connect函数可以建立不同的连接类型,常用的连接类型有: - Qt::AutoConnection(默认类型):在同一线程中,使用直接调用来进行信号和槽的连接;在不同线程中,使用Qt::QueuedConnection类型进行连接。 - Qt::DirectConnection:在同一线程中,使用直接调用来进行信号和槽的连接。 - Qt::QueuedConnection:在不同线程中,使用事件队列来进行信号和槽的连接。 - Qt::BlockingQueuedConnection:在不同线程中,使用事件队列来进行信号和槽的连接,但是发送信号的线程会被阻塞,直到槽函数执行完毕。 通过connect函数,可以将一个信号连接到一个或多个槽函数,实现信号和槽之间的通信。这种机制使得不同的对象之间可以进行高效的通信和数据传递,为Qt框架提供了强大的事件处理和消息机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值