Qt 原理-MOC(2) QObject.h
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()
對(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,
};
//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)題。
- 上一篇: Qt 原理-MOC(1)Meta Obj
- 下一篇: 6. Qt 信号与信号槽(8)实例分析