|
@@ -1 +1,88 @@
|
|
-# Qt对象(The QObject)
|
|
|
|
|
|
+# QObject对象(The QObject)
|
|
|
|
+
|
|
|
|
+正如介绍中描述的,```QObject```是Qt的内省机制。在Qt中它几乎是所有类的基类。值类型除外,例如```QColor```,```QString```和```QList```。
|
|
|
|
+
|
|
|
|
+Qt对象是一个标准的C++对象,但是它具有更多的功能。可以从两个方向来深入探讨:内省和内存管理。内省意味着Qt对象知道它的类名,它与其它类的关系,以及它的方法和属性。内存管理意味着每个Qt对象都可以成为是其它子对象的父对象。父对象拥有子对象,当父对象销毁时,它也会负责销毁它的子对象。
|
|
|
|
+
|
|
|
|
+理解```QObject```的能力如何影响一个类最好的方法是使用Qt的类来替换一个典型的C++类。如下所示的代表一个普通的类。
|
|
|
|
+
|
|
|
|
+类```Person```是一个数据类,包含了一个名字和性别属性。```Person```使用Qt的对象系统来添加一个元信息到c++类中。它允许使用```Person```对象的用户连接槽函数并且当属性变化时获得通知。
|
|
|
|
+
|
|
|
|
+```
|
|
|
|
+class Person : public QObject
|
|
|
|
+{
|
|
|
|
+ Q_OBJECT // enabled meta object abilities
|
|
|
|
+
|
|
|
|
+ // property declarations required for QML
|
|
|
|
+ Q_PROPERTY(QString name READ name WRITE setName NOTIFY nameChanged)
|
|
|
|
+ Q_PROPERTY(Gender gender READ gender WRITE setGender NOTIFY genderChanged)
|
|
|
|
+
|
|
|
|
+ // enables enum introspections
|
|
|
|
+ Q_ENUMS(Gender)
|
|
|
|
+
|
|
|
|
+public:
|
|
|
|
+ // standard Qt constructor with parent for memory management
|
|
|
|
+ Person(QObject *parent = 0);
|
|
|
|
+
|
|
|
|
+ enum Gender { Unknown, Male, Female, Other };
|
|
|
|
+
|
|
|
|
+ QString name() const;
|
|
|
|
+ Gender gender() const;
|
|
|
|
+
|
|
|
|
+public slots: // slots can be connected to signals
|
|
|
|
+ void setName(const QString &);
|
|
|
|
+ void setGender(Gender);
|
|
|
|
+
|
|
|
|
+signals: // signals can be emitted
|
|
|
|
+ void nameChanged(const QString &name);
|
|
|
|
+ void genderChanged(Gender gender);
|
|
|
|
+
|
|
|
|
+private:
|
|
|
|
+ // data members
|
|
|
|
+ QString m_name;
|
|
|
|
+ Gender m_gender;
|
|
|
|
+};
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+构造函数传入父对象到超类中并且初始化成员变量。Qt的值类型类会自动初始化。在这个例子中```QString```
|
|
|
|
+将会初始化为一个空字符串(```QString::isNull()```)并且性别成员变量会明确的初始化为未知性别。
|
|
|
|
+
|
|
|
|
+```
|
|
|
|
+Person::Person(QObject *parent)
|
|
|
|
+ : QObject(parent)
|
|
|
|
+ , m_gender(Person::Unknown)
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+获取函数在命名在属性后并且是一个简单的```const```函数。使用设置属性函数当属性被改变时会发送改变信号。为此我们插入一个保护用来比较当前值与新值。只有在值不同时我们指定给成员变量的值才会生效,并且发送改变信号。
|
|
|
|
+
|
|
|
|
+```
|
|
|
|
+QString Person::name() const
|
|
|
|
+{
|
|
|
|
+ return m_name;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+void Person::setName(const QString &name)
|
|
|
|
+{
|
|
|
|
+ if (m_name != name) // guard
|
|
|
|
+ {
|
|
|
|
+ m_name = name;
|
|
|
|
+ emit nameChanged(m_name);
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+类通过继承```QObject```,我们获得了元对象能力,我们可以尝试使用```metaObject()```的方法。例如从对象中检索类名。
|
|
|
|
+
|
|
|
|
+```
|
|
|
|
+Person* person = new Person();
|
|
|
|
+person->metaObject()->className(); // "Person"
|
|
|
|
+Person::staticMetaObject.className(); // "Person"
|
|
|
|
+```
|
|
|
|
+
|
|
|
|
+QObject基类和元对象还有其它很多功能。详情请查看```QMetaObject```文档获取更多信息。
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|