学习QObject的宏帮助我们更方便的利用Qt的元对象的技术,下面开始分析。
Q_CLASSINFO(“”,“”)
这个宏用来注册该类的信息,当我们希望从这个类获得我们想要的信息的时候,
就可以利用元对象类使用起来很方便,如:
q_ptr指向集成QObject的一个类
该类注册了这个信息
Q_CLASSINFO(“Author”,"aaaa")
int index = q_ptr->metaObject()->indexOfClassInfo("Author");
QString ss = q_ptr->metaObject()->classInfo(index).value();
我们可以获得这个注册信息了。
如果我们想获得类的名称也可以通过元对象获得
QString name = q_ptr->metaObject()->className();
这个技术用于插件加载很有用,(设计图元工厂的时候能用到哦)。
Q_DISABLE_COPY(classname)
这个宏用于注册一个类将拷贝构造函数和重载=操作符设置成私有。
class MyClass : public QObject
{
private:
Q_DISABLE_COPY(MyClass)
};
等价于:
class MyClass : public QObject
{
private:
MyClass(const MyClass &);
MyClass &operator=(const MyClass &);
};
下面这样写编译器也会报错
QWidget w = QWidget();
Q_EMIT ,Q_SIGNALS,Q_SLOTS
我们定义信号槽的时候可以这么写
public slots:
或者Q_SLOTS
官方为跨平台考虑建议我们用Q_SLOTS
有slots,emit,signals这些名字又可能被用于第三方库,所以应避免这么定义,同时我们在pro里定义 CONFIG += no_keywords 它告诉QT不要定义moc关键字signals,slots和emit。
Q_ENUMS:将类中的宏注册到元对象中。
获得宏的值,使用时如:
在类中注册了这样一个宏,q_ptr指向这个类
Q_ENUMS(Edata) enum Edata{ eName = 0, eCode = 1, eType = 2, };
for (int i=q_ptr->metaObject()->enumeratorOffset();\ i<q_ptr->metaObject()->enumeratorCount();i++) { QMetaEnum menum = q_ptr->metaObject()->enumerator(i); QString ss = menum.name(); for(int ii=0;ii<menum.keyCount();ii++) { QString a = menum.key(ii); } }
这个函数把所有宏的名称和宏的值代表的名称全部显示
Q_FLAGS():这个宏和Q_ENUMS是一样的,但是如果你两个都用,就会注册两个对象。
Q_INTERFACES():这个宏告诉Qt接口类的实现,用于插件
class BasicToolsPlugin : public QObject,
public BrushInterface,
public ShapeInterface,
public FilterInterface
{
Q_OBJECT
Q_INTERFACES(BrushInterface ShapeInterface FilterInterface)
public:
...
};
Q_INVOKABLE注册成员数到元对象中,可以通过元对象进行调用。