12.1. QMetaObject - The Meta Object Pattern

[ fromfile: reflection.xml id: metaobjects ]

A meta object is an object that describes the structure of another object.[88]

A class that has a MetaObject supports reflection. This is a feature found in many object-oriented languages. It does not exist in C++, but Qt's MetaObject compiler, moc, generates the code to support this for specially equipped QObjects.

As long as certain conditions apply,[89] each class derived from QObject has a QMetaObject generated for it by moc, similar to those we have for Customer and Address, shown in Figure 12.1. QObject has a member function that returns a pointer to the object's QMetaObject. The prototype of that function is

QMetaObject* QObject::metaObject () const [virtual]

You can use these methods of QMetaObject to get information about a QObject:

The signal and slot mechanism also relies on the QMetaObject. Figure 12.1 shows the inheritance relationships between the Qt base classes, derived QObjects, and the moc-generated meta classes for them.

Figure 12.1.  MetaObjects

MetaObjects

By using the QMetaObject and QMetaProperty, you can write code that is generic enough to handle all self-describing classes.



[88] Meta, the Latin root meaning about, is used for its literal definition here.

[89] Each class must be defined in a header file, listed in the project file's HEADERS, and must include the Q_OBJECT macro in its class definition.