QObject 对象翻译要点
1 .信号机制
2.可以根据类型或者对象名称查询对象的子对象,父对象删除时,其子对象被自动删除和调用析构函数
3.对象名称(objectName)和className(通过元对象系统获取)
4,通过inherits()可以判断一个对象是否继承于某个类和是否时该类的一个对象
5.当对象被删除时,会发送一个destoryed()信号,我们可以捕获这个信号避免对象悬空
6.对象通过event()获取事件,并决定是否应该处理该事件(子对象可以重写该函数,实现自己的处理逻辑),使用eventFilter()函数过滤其他控件的事件(其他控件要添加控件事件过滤器-installEventFilter()).childEvent()能够捕捉子类控件的事件
7.定时器功能(QTimer)
8.对于实现信号,插槽或属性的任何对象,Q_OBJECT宏都是必需的。 您还需要在源文件上运行Meta Object Compiler。 我们强烈建议在QObject的所有子类中都使用此宏,而不管它们是否实际使用信号,插槽和属性,因为不这样做可能会导致某些函数表现出奇怪的行为。
9.所有widget都是继承QObject, 便利函数 isWidgetType()比qobject_cast<QWidget *>(obj) or obj->inherits(“QWidget”)快的多
10.通常,一个对象可以接受其他线程发送的信号或者事件,对象对应的槽函数和事件处理将在对象所在的线程中执行,然而如果该对象不具有线程亲缘(Thread Affinity)关系,或者不具有事件处理循环(没有继承QObject),则不能接受相应的信号或者事件。
11 .可以使用thread()查看对象所在的线程,使用moveToThread()可以改变对象所在的线程。
12.所有QObject必须与父对象代驻留在同一线程中。 所以:
如果两个QObject位于不同的线程中,则setParent()将失败。当一个QObject移到另一个线程时,它的所有子对象也将被自动移动。如果QObject有一个父对象,则moveToThread()将失败。
如果QObject是在QThread :: run()中创建的,则它们不能成为QThread对象的子级,因为QThread不在调用QThread :: run()的线程中。
注意:QObject的成员变量不会自动成为其子级。 必须通过将指针传递给孩子的构造函数或通过调用setParent()来设置父子关系。 如果没有此步骤,则在调用moveToThread()时,对象的成员变量将保留在旧线程中。
13.QObject和其子类没有拷贝赋值和拷贝构造(实际上时是私有函数),因此,一般如果要多处地方使用该对象,一般都时使用指针。
14.信号与槽是自动连接的
14.动态属性(可以动态判断一些控件或者获取控件的一些属性值)
15.国际化
a.使用QString(用户可见时)
b.“程序员空间”中的字符串(例如QObject名称和文件格式文本)不需要使用QString; 传统的char *或QByteArray类就足够了。
c.对所有文字使用tr()