日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Qt 原理-MOC(2) QObject.h

發(fā)布時(shí)間:2025/3/21 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Qt 原理-MOC(2) QObject.h 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

QObject.h的主要作用

Q_OBJECT宏主要做了這幾件事:

1. 定義一個(gè)靜態(tài)的元對(duì)象staticMetaObject。
2. 重載QObject類定義的虛函數(shù)metaObject()。
4. 重載QObject類定義的虛函數(shù)qt_metacast()
5. 重載QObject類定義的虛函數(shù)qt_metacall()
6. 定義靜態(tài)函數(shù)qt_static_metacall()

  • 國(guó)際化支持,QT_TR_FUNCTIONS會(huì)被展開(kāi)為tr()和trUtf8()兩個(gè)函數(shù),以便你可以
    對(duì)你的類中需要作國(guó)際化處理的字符串使用它們。
  • 1 看代碼

    #define Q_OBJECT
    public:
    static const QMetaObject staticMetaObject;
    virtual const QMetaObject *metaObject() const;
    virtual void *qt_metacast(const char *);
    virtual int qt_metacall(QMetaObject::Call, int, void **);
    Q_DECL_HIDDEN_STATIC_METACALL static void qt_static_metacall(QObject *, QMetaObject::Call, int, void **);

    #define QT_TR_FUNCTIONS
    static inline QString tr(const char *s, const char *c = nullptr, int n = -1)
    { return staticMetaObject.tr(s, c, n); } \

    2.舉例說(shuō)明

    Jerry.h

    class Jerry : public QObject {Q_OBJECT public:Jerry(QObject *parent = nullptr) : QObject(parent){} public slots:void runAway(){qDebug() << u8"那只貓又來(lái)了,快溜!" ;} };

    moc_Jerry.cpp

    struct qt_meta_stringdata_Jerry_t {
    QByteArrayData data[3];
    char stringdata0[15];
    };
    #define QT_MOC_LITERAL(idx, ofs, len)
    Q_STATIC_BYTE_ARRAY_DATA_HEADER_INITIALIZER_WITH_OFFSET(len,
    qptrdiff(offsetof(qt_meta_stringdata_Jerry_t, stringdata0) + ofs
    - idx * sizeof(QByteArrayData))
    )
    static const qt_meta_stringdata_Jerry_t qt_meta_stringdata_Jerry = {//包含類名、信號(hào)函數(shù)名稱等

    {

    QT_MOC_LITERAL(0, 0, 5), // "Jerry"第一個(gè)0表示數(shù)組里第0個(gè),第二個(gè)0表示開(kāi)始索引,5是長(zhǎng)度

    QT_MOC_LITERAL(1, 6, 7), // “runAway”
    QT_MOC_LITERAL(2, 14, 0) // “”
    },
    “Jerry\0runAway\0”
    };
    #undef QT_MOC_LITERAL

    static const uint qt_meta_data_Jerry[] = {//格式是固定的, 既是struct QMetaObjectPrivate的成員變量(點(diǎn)擊查看文章)

    // content:
    8, // revision
    0, // classname
    0, 0, // classinfo
    1, 14, // methods
    0, 0, // properties
    0, 0, // enums/sets
    0, 0, // constructors
    0, // flags
    0, // signalCount

    // slots: name, argc, parameters, tag, flags
    1, 0, 19, 2, 0x0a /* Public */,

    // slots: parameters
    QMetaType::Void,

    0 // eod

    };

    //5. 定義靜態(tài)函數(shù)qt_static_metacall。

    void Jerry::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a)
    {
    if (_c == QMetaObject::InvokeMetaMethod) {
    auto *_t = static_cast<Jerry *>(_o);
    Q_UNUSED(_t)
    switch (_id) {
    case 0: _t->runAway(); break;
    default: ;
    }
    }
    Q_UNUSED(_a);
    }

    //1.定義一個(gè)靜態(tài)的元對(duì)象staticMetaObject。

    QT_INIT_METAOBJECT const QMetaObject Jerry::staticMetaObject = { {//
    &QObject::staticMetaObject,
    qt_meta_stringdata_Jerry.data,
    qt_meta_data_Jerry,
    qt_static_metacall,
    nullptr,
    nullptr
    } };

    //2. 重載QObject類定義的虛函數(shù)metaObject()。

    const QMetaObject *Jerry::metaObject() const
    {
    return QObject::d_ptr->metaObject ? QObject::d_ptr->dynamicMetaObject() : &staticMetaObject;
    }

    //3. 重載QObject類定義的虛函數(shù)qt_metacast()

    void *Jerry::qt_metacast(const char _clname)
    {
    if (!_clname) return nullptr;
    if (!strcmp(_clname, qt_meta_stringdata_Jerry.stringdata0))
    return static_cast<void>(this);
    return QObject::qt_metacast(_clname);
    }

    //4. 重載QObject類定義的虛函數(shù)qt_metacall()

    int Jerry::qt_metacall(QMetaObject::Call _c, int _id, void **_a)
    {
    _id = QObject::qt_metacall(_c, _id, _a);
    if (_id < 0)
    return _id;
    if (_c == QMetaObject::InvokeMetaMethod) {
    if (_id < 1)
    qt_static_metacall(this, _c, _id, _a);
    _id -= 1;
    } else if (_c == QMetaObject::RegisterMethodArgumentMetaType) {
    if (_id < 1)
    reinterpret_cast<int>(_a[0]) = -1;
    _id -= 1;
    }
    return _id;
    }

    總結(jié)

    以上是生活随笔為你收集整理的Qt 原理-MOC(2) QObject.h的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。