QObject宏的解析

来源:互联网 发布:photoshop cs6破解mac 编辑:程序博客网 时间:2024/05/17 23:22

学习QObject的宏帮助我们更方便的利用Qt的元对象的技术,下面开始分析。

Q_CLASSINFO(“”,“”)

这个宏用来注册该类的信息,当我们希望从这个类获得我们想要的信息的时候,

就可以利用元对象类使用起来很方便,如:

q_ptr指向集成QObject的一个类

该类注册了这个信息

Q_CLASSINFOAuthor”,"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注册成员数到元对象中,可以通过元对象进行调用。