StupidBeauty
Read times:1569Posted at: - no title specified

Qt5.2文档翻译:QObject,QObject Class

Q_CLASSINFO NameValue)

Q_DISABLE_COPY Class)

Q_EMIT

Q_ENUMS (...)

Q_FLAGS (...)

Q_INTERFACES (...)

Q_INVOKABLE

Q_OBJECT

Q_PROPERTY (...)

Q_REVISION

Q_SET_OBJECT_NAME Object)

Q_SIGNAL

Q_SIGNALS

Q_SLOT

Q_SLOTS

宏文档

Q_CLASSINFONameValue)

这个宏,将额外的信息与这个类关联起来, 这些信息可使用 QObject::metaObject ()来读取。 Qt 仅在 Active Qt Qt D-Bus 和Qt QML 模块中有限地使用这个特性。

额外信息的形式是,一个 Name字符串和一个对应的 Value字符串常量。

示例:

class MyClass : public QObject

{

Q_OBJECT

Q_CLASSINFO("Author", "Pierre Gendron")

Q_CLASSINFO("URL", "http://www.my-organization.qc.ca")

public:

...

};

参考 QMetaObject::classInfo () QAxFactory 使用Qt D-Bus适配 扩展QML - 默认属性示例

Q_DISABLE_COPYClass)

针对指定的类 Class ,禁止使用复制构造函数及赋值操作符。

QObject 的子类的实例,不应当被看作可被复制或赋值的值,而应当看作独一无二的实体。 这就意味着, 当妳创建自己的 QObject 子类(无论直接子类 还是间接子类 ) 时, 不应该 给它加上复制构造函数 及赋值操作符。但是,只是 在妳的类中省略 这两个东西的话,可能并不足够,因为 ,如果 不小心写出了一些需要复制构造函数 或赋值操作符的代码(这其实狠容易发生)的话,则, 的编译器会体贴地帮妳创建一个。所以 妳必须做更多事情。

好奇 的朋友 会发现,那些继承 QObject 的Qt 类 一般都在私有成员区包含了这个宏:

class MyClass : public QObject

{

private:

Q_DISABLE_COPY(MyClass)

};

它会在私有成员区声明一个复制构造函数和一个赋值操作符,于是,当妳不小心写出会用到它们的代码时,编译器会报告错误。

class MyClass : public QObject

{

private:

MyClass(const MyClass &);

MyClass &operator=(const MyClass &);

};

但是,即便如此,也可能无法完全处理好所有的情况。妳可能会写这样的代码:

QWidget w = QWidget ();

首先, 不要这么写。 大部分编译器会生成使用复制构造函数 的代码,于是 就会报告错误说妳使用了私有成员区的函数,但是, 妳的 C++编译器 并没被要求 以特殊的方式为 这条语句生成代码。 它可能会生成 一种特别的代码, 既不 使用 我们声明为私有的复制构造函数, 也不 使用我们声明为私有的赋值操作符。 在那种情况下,不会报告出错误,但是, 当妳调用 w 的某个成员函数时, 妳的应用程序可能会崩溃。

Q_ENUMS(...)

这个宏,会将一个或多个枚举类型注册到元对象系统中。

例如:

class MyClass : public QObject

{

Q_OBJECT

Q_ENUMS(Priority)

public:

MyClass( QObject *parent = 0);

~MyClass();

enum Priority { High, Low, VeryHigh, VeryLow };

void setPriority(Priority priority);

Priority priority() const;

};

如果 妳想注册某个在另一个类中声明的枚举,则,必须使用定义 了该枚举的那个类的名字 来完整 地标识 它。另外 定义 了该枚举的那个类,必须继承 QObject ,并且 也要使用Q_ENUMS()来声明那个枚举。

参考 Qt 的属性系统

Q_INTERFACES(...)

这个宏,告知Qt,这个类实现了哪些接口。这是在实现插件时使用的。

示例:

class BasicToolsPlugin : public QObject ,

public BrushInterface,

public ShapeInterface,

public FilterInterface

{

Q_OBJECT

Q_PLUGIN_METADATA(IID "org.qt-project.Qt.Examples.PlugAndPaint.BrushInterface" FILE "basictools.json")

Q_INTERFACES(BrushInterface ShapeInterface FilterInterface)

public:

...

};

参考 即插即画基本工具 示例 以了解细节。

参考 Q_DECLARE_INTERFACE () Q_PLUGIN_METADATA () 如何创建Qt插件

Q_OBJECT

如果某个类声明了它自己的信号和信号槽或者使用了Qt 的元对象系统提供的其它服务的话,则,在该类的定义的私有区,必须有Q_OBJECT 宏出现。

例如:

#include <QObject>

class Counter : public QObject

{

Q_OBJECT

public:

Counter() { m_value = 0; }

int value() const { return m_value; }

public slots:

void setValue( int value);

signals:

void valueChanged( int newValue);

private:

int m_value;

};

注意 这个宏要求该类是 QObject 的子类。对于 一个并非为 QObject 子类的类, 可使用 Q_GADGET 而不是 Q_OBJECT ,来启用元对象系统中对于该类的枚举的支持。 Q_GADGET使得 类中会出现一个名为 staticMetaObject 的类成员。 staticMetaObject is 的类型为 QMetaObject ,并且提供 了对于用Q_ENUMS 声明的枚举的访问功能。 Q_GADGET 只对 C++ 有用。

参考 元对象系统 信号 及信号槽 Qt 的属性系统

Q_PROPERTY(...)

这个宏,用来在继承了 QObject 的类中声明属性。属性 ,与类的数据成员类似,但是,它们 还有一些可通过 元对象系统 访问到的额外特性。

Q_PROPERTY(type name

(READ getFunction [WRITE setFunction] |

MEMBER memberName [(READ getFunction | WRITE setFunction)])

[RESET resetFunction]

[NOTIFY notifySignal]

[REVISION int ]

[DESIGNABLE bool]

[SCRIPTABLE bool]

[STORED bool]

[USER bool]

[CONSTANT]

[FINAL])

属性 的名字、类型和读取( READ )函数是必需的。类型, 可以是 QVariant 支持 的任意类型,也可以是用户自定义的类型。其它东西 都是可选的,不过,写入( WRITE )函数一般都会带上的。后面那些属性 的默认值是真(true),只有 USER 是例外,它的默认值是假(false)。

例如:

Q_PROPERTY( QString title READ title WRITE setTitle USER true)

欲知更多关于如何使用 这个宏的细节,以及 更详细的关于它的用法的示例, 则阅读 Qt 的属性系统 中的讨论。

参考 Qt 的属性系统

Your opinions
Your name:Email:Website url:Opinion content:
- no title specified

HxLauncher: Launch Android applications by voice commands