⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 moc.html

📁 QT3的教程
💻 HTML
📖 第 1 页 / 共 2 页
字号:
</pre>
 
<p> 次重要的是,后面的构造是不合法的。所有的这些都可以替换为我们通常认为比较好的方案,所以去掉这些限制对于我们来说并不是高优先级的。
<p> <h3> 多重继承需要把<a href="qobject.html">QObject</a>放在第一个
</h3>
<a name="5-1"></a><p> 如果你使用多重继承,元对象编译器假设<em>首先</em>继承的类是QObject的一个子类。也就是说,确信<em>仅仅</em>首先继承的类是QObject。
<p> <pre>
    class SomeClass : public <a href="qobject.html">QObject</a>, public OtherClass {
        ...
    };
</pre>
 
<p> (这个限制几乎是不可能去掉的;因为元对象编译器并不展开#include或者#define,它不能发现基类中哪个是QObject。)
<p> <h3> 函数指针不能作为信号和槽的参数
</h3>
<a name="5-2"></a><p> 在你考虑使用函数指针作为信号/槽的参数的大多数情况下,我们认为继承是一个不错的替代方法。这里是一个不合法的语法的例子:
<p> <pre>
    class SomeClass : public <a href="qobject.html">QObject</a> {
        Q_OBJECT
        ...
    public slots:
        // 不合法的
        void apply( void (*apply)(List *, void *), char * );
    };
</pre>
 
<p> 你可以在这样一个限制范围内工作:
<pre>
    typedef void (*ApplyFunctionType)( List *, void * );

    class SomeClass : public <a href="qobject.html">QObject</a> {
        Q_OBJECT
        ...
    public slots:
        void apply( ApplyFunctionType, char * );
    };
</pre>
 
<p> 有时用继承和虚函数、信号和槽来替换函数指针是更好的。
<p> <h3> 友声明不能放在信号部分或者槽部分中
</h3>
<a name="5-3"></a><p> 有时它也许会工作,但通常情况下,友声明不能放在信号部分或者槽部分中。把它们替换到私有的、保护的或者公有的部分中。这里是一个不合法的语法的例子:
<p> <pre>
    class SomeClass : public <a href="qobject.html">QObject</a> {
        Q_OBJECT
        ...
    signals:
        friend class ClassTemplate&lt;char&gt;; // 错的
    };
</pre>
 
<p> <h3> 信号和槽不能被升级
</h3>
<a name="5-4"></a><p> 把继承的成员函数升级为公有状态这一个C++特征并不延伸到包括信号和槽。这里是一个不合法的例子:
<p> <pre>
    class Whatever : public <a href="qbuttongroup.html">QButtonGroup</a> {
        ...
    public slots:
        void QButtonGroup::buttonPressed; // 错的
        ...
    };
</pre>
 
<p> QButtonGroup::buttonPressed()槽是保护的。
<p> C++测验:如果你试图升级一个被重载的保护成员函数将会发生什么?
<ol type=1>
<li> 所有的函数都被重载。
<li> 这不是标准的C++。
</ol>
<p> 
<p> <h3> 类型宏不能被用于信号和槽的参数
</h3>
<a name="5-5"></a><p> 因为元对象编译器并不展开#define,在信号和槽中类型宏作为一个参数是不能工作的。这里是一个不合法的例子:
<p> <pre>
    #ifdef ultrix
    #define SIGNEDNESS(a) unsigned a
    #else
    #define SIGNEDNESS(a) a
    #endif

    class Whatever : public <a href="qobject.html">QObject</a> {
        ...
    signals:
        void someSignal( SIGNEDNESS(int) );
        ...
    };
</pre>
 
<p> 不含有参数的#define将会像你所期望的那样工作。
<p> <h3> 嵌套类不能放在信号部分或者槽部分,也不能含有信号和槽
</h3>
<a name="5-6"></a><p> 这里是一个例子:
<p> <pre>
    class A {
        Q_OBJECT
    public:
        class B {
        public slots:   // 错的
            void b();
            ...
        };
    signals:
        class B {       // 错的
            void b();
            ...
        }:
    };
</pre>
 
<p> <h3> 构造函数不能用于信号部分和槽部分
</h3>
<a name="5-7"></a><p> 为什么一个人会把一个构造函数放到信号部分或者槽部分,这对于我们来说都是很神秘的。你无论如何也不能这样做(除去它偶尔能工作的情况)。请把它们放到私有的、保护的或者公有的部分中,它们本该属于的地方。这里是一个不合法的语法的例子:
<p> <pre>
    class SomeClass : public <a href="qobject.html">QObject</a> {
        Q_OBJECT
    public slots:
        SomeClass( <a href="qobject.html">QObject</a> *parent, const char *name )
            : <a href="qobject.html">QObject</a>( parent, name ) { } // 错的
        ...
    };
</pre>
 
<p> <h3> 属性的声明应该放在含有相应的读写函数的公有部分之前
</h3>
<a name="5-8"></a><p> 在包含相应的读写函数的公有部分之中和之后声明属性的话,读写函数就不能像所期望的那样工作了。元对象编译器会抱怨不能找到函数或者解析这个类型。这里是一个不合法的语法的例子:
<p> <pre>
    class SomeClass : public <a href="qobject.html">QObject</a> {
        Q_OBJECT
    public:
        ...
        Q_PROPERTY( Priority priority READ priority WRITE setPriority ) // 错的
        Q_ENUMS( Priority ) // 错的
        enum Priority { High, Low, VeryHigh, VeryLow };
        void setPriority( Priority );
        Priority priority() const;
        ...
    };
</pre>
 
<p> 根据这个限制,你应该在Q_OBJECT之后,在这个类的声明之前声明所有的属性:
<p> <pre>
    class SomeClass : public <a href="qobject.html">QObject</a> {
        Q_OBJECT
        Q_PROPERTY( Priority priority READ priority WRITE setPriority )
        Q_ENUMS( Priority )
    public:
        ...
        enum Priority { High, Low, VeryHigh, VeryLow };
        void setPriority( Priority );
        Priority priority() const;
        ...
    };
</pre>
 
<p> 
<!-- eof -->
<p><address><hr><div align=center>
<table width=100% cellspacing=0 border=0><tr>
<td>Copyright &copy; 2002 
<a href="http://www.trolltech.com">Trolltech</a>
<td><a href="http://www.trolltech.com/trademarks.html">Trademarks</a>
<td><a href="zh_CN.html">译者:Cavendish</a>
<td align=right><div align=right>Qt 3.0.5版</div>
</table></div></address></body>
</html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -