ソースを参照

添加Qt元对象系统介绍,添加Qt编译系统介绍。

cwc1987 10 年 前
コミット
047d9b1448
4 ファイル変更117 行追加1 行削除
  1. 2 0
      SUMMARY.md
  2. 26 0
      qt_and_c++/build_systems.md
  3. 1 0
      qt_and_c++/qmake.md
  4. 88 1
      qt_and_c++/the_qobject.md

+ 2 - 0
SUMMARY.md

@@ -105,6 +105,8 @@
 * [Qt and C++](qt_and_c++/README.md)
 * [Qt and C++](qt_and_c++/README.md)
    * [演示程序(A Boilerplate Application)](qt_and_c++/a_boilerplate_application.md)
    * [演示程序(A Boilerplate Application)](qt_and_c++/a_boilerplate_application.md)
    * [Qt对象(The QObject)](qt_and_c++/the_qobject.md)
    * [Qt对象(The QObject)](qt_and_c++/the_qobject.md)
+   * [编译系统(Build Systems)](qt_and_c++/build_systems.md)
+       * [QMake](qt_and_c++/qmake.md)
 * [其它(Other)](other/README.md)
 * [其它(Other)](other/README.md)
    * [协作校正](other/collaboration_correction.md)
    * [协作校正](other/collaboration_correction.md)
 
 

+ 26 - 0
qt_and_c++/build_systems.md

@@ -0,0 +1,26 @@
+# 编译系统(Build Systems)
+
+在不同的平台上稳定的编译软件是一个复杂的任务。你将会遇到不同环境下的不同编译器,路径和库变量的问题。Qt的目的是防止应用开发者遭遇这些跨平台问题。为了完成这个任务,Qt引进了```qmake```编译文件生成器。```qmake```操作以```.pro```
+结尾的项目文件。这个项目文件包含了关于应用程序的说明和需要读取的资源文件。用qmake执行这个项目文件会为你生成一个在unix和mac的```Makefile```
+,如果在windows下使用mingw编译工具链也会生成。否则可能会创建一个visual studio项目或者一个xcode项目。
+
+在unix下使用Qt编译如下:
+
+```
+$ edit myproject.pro
+$ qmake // generates Makefile
+$ make
+```
+
+Qt也允许你使用影子编译。影子编译会在你的源码位置外的路径进行编译。假设我们有一个myproject文件夹,里面有一个myproject.pro文件。如下输入命令:
+
+```
+$ mkdir build
+$ cd build
+$ qmake ../myproject/myproject.pro
+```
+
+我们创建一个编译文件夹并且在这个编译文件中使用qmake指向我们项目文件夹中的项目文件。这将配置makefile使用编译文件夹替代我们的源代码文件夹来存放所有的编译中间件和结果。这允许我们同时为不同的qt版本和编译配置创建不同的编译文件夹并且不会弄乱我们的源代码文件夹。
+
+当你使用Qt Creator时,它会在后代为你做这些事情,通常你不在需要担心这些步骤。对于比较大的项目,建议使用命令行方式来编译你的Qt项目可以更加深入的了解编译流。
+

+ 1 - 0
qt_and_c++/qmake.md

@@ -0,0 +1 @@
+# QMake

+ 88 - 1
qt_and_c++/the_qobject.md

@@ -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```文档获取更多信息。
+
+
+
+