Qt5.2文档翻译:QObject类,QObject Class
Q_CLASSINFO ( Name, Value) |
|
Q_DISABLE_COPY ( Class) |
|
Q_ENUMS (...) |
|
Q_FLAGS (...) |
|
Q_INTERFACES (...) |
|
Q_PROPERTY (...) |
|
Q_SET_OBJECT_NAME ( Object) |
|
这个宏,将额外的信息与这个类关联起来, 这些信息可使用 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 - 默认属性示例 。
针对指定的类 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 &);
};
但是,即便如此,也可能无法完全处理好所有的情况。妳可能会写这样的代码:
首先, 不要这么写。 大部分编译器会生成使用复制构造函数 的代码,于是 就会报告错误说妳使用了私有成员区的函数,但是, 妳的 C++编译器 并没被要求 以特殊的方式为 这条语句生成代码。 它可能会生成 一种特别的代码, 既不 使用 我们声明为私有的复制构造函数, 也不 使用我们声明为私有的赋值操作符。 在那种情况下,不会报告出错误,但是, 当妳调用 w 的某个成员函数时, 妳的应用程序可能会崩溃。
这个宏,会将一个或多个枚举类型注册到元对象系统中。
例如:
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,这个类实现了哪些接口。这是在实现插件时使用的。
示例:
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插件 。
如果某个类声明了它自己的信号和信号槽或者使用了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 的属性系统 。
这个宏,用来在继承了 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)
Your opinionsHxLauncher: Launch Android applications by voice commands