QObject类

博客围绕Qt中QObject类展开,它是所有Qt对象的基类。介绍了其所有成员列表,包括过时成员,提示函数可重入。还详细阐述了属性,如objectName属性可用于查找子对象,此外还涉及公有函数、槽函数、信号等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 QObject类是所有Qt对象的基类。

Header:#include <QObject>
CMake:find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake:QT += core
Inherited By:

共200多个派生类(略)

 提示:所有函数都是可重入的。


详细描述>>>


 属性 

用来包含对象的名称,当要查找子对象时可以使用findChild()通过对象名称查找对象。默认此属性为空。


 公有函数  

QObject(QObject *parent = nullptr)

构造函数。parent是父对象指针,当它为nullptr将构造一个没有父对象的对象。如果对象是一个QWidget,它将成为一个顶级窗口。这个函数可以通过元对象系统和QML调用。

注意:当构造时通过parent提供了父对象,新创建的QObject对象会将自己添加到父对象的children()列表,当父对象析构时,列表中的所有对象也会被析构。这就是Qt中“对象树”的概念,它在一定程度上解决了内存回收问题。

想要在Qt中实现内存自动回收,需要满足两个条件:
1.创建的对象是QObject类或其子类。
2.创建出的类对象,必须要指定父对象。
通常是通过构造函数中的QObject *parent 或 QWidget *parent 指针,当然,也可以在对象创建后使用QObject::setParent()或 QWidget ::setParent()函数。

参见: parent(), findChild() 和 findChildren()。

virtual~QObject()
QBindablebindableObjectName()

注意:该属性支持QProperty绑定。

该属性保存该对象的名称,您可以使用findChild()通过名称(和类型)来查找对象。您可以使用findChildren()找到一组对象。

此属性默认包含一个空字符串。

boolblockSignals(bool block)

如果block 为 true,则此对象发出的信号将被阻止(即:发出信号不会调用与其连接的任何内容)。如果为 false,则不会发生此类阻塞。signalsBlocked()用于返回当前是否处于阻塞状态。

注意:对象的销毁destroyed()信号,是无法被阻塞的。

被阻塞时发出的信号不会被缓冲。

const QObjectList &children() const

返回子对象的列表,其返回值QObjectList对象在<QObject>头文件中定义如下:

typedef QList<QObject*> QObjectList;

添加的第一个子项是列表中的 first 对象,最后添加子项是列表中的 last 对象,即总是在末尾附加新的子项。

注意:列表顺序在以下情况下会发生变化。当QWidget的孩子在控件堆栈中提高 raised或降低 lowered时。提升的控件将成为列表中的最后一个对象,降低的控件将成为列表中的第一个对象。

QMetaObject::Connectionconnect(const QObject *sender, const char *signal, const char *method, Qt::ConnectionType type = Qt::AutoConnection) const
此函数重载connect()。 将信号signal 从发送方sender对象连接到该对象的方法method。 相当于connect(sendersignalthismethodtype)。 您建立的每个连接都会发出一个信号,因此重复的连接会发出两个信号。您可以使用disconnect()断开连接。 注意:这个函数是线程安全的。
booldisconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const

断开 signal-slot 的连接。 当涉及的任何一个对象被销毁时,信号插槽连接就会被删除。

注意:断开所有 signal-slot 连接也将断开QObject::destroyed()信号(如果已连接)。这样做会对依赖该信号清理资源的类产生负面影响。建议仅断开由应用程序代码连接的特定信号。

booldisconnect(const QObject *receiver, const char *method = nullptr) const
将此对象中的所有signal-slot 的连接断开。 
voiddumpObjectInfo() const
转储有关信号连接等的信息。调试输出。
voiddumpObjectTree() const
将子树转储到调试输出。
QListdynamicPropertyNames() const
返回使用setProperty()动态添加到对象的所有属性的名称。
virtual boolevent(QEvent *e)
virtual booleventFilter(QObject *watched, QEvent *event)
如果此对象watched已作为监视对象的事件过滤器安装,则筛选event事件。【官方示例
TfindChild(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

返回此对象的子对象,该子对象可以转换为T类型,名称为name。如果没有这样的对象,则name为nullptr。空名称参数导致所有对象都匹配。一个空的非null名称仅匹配objectName为空的对象。搜索以递归方式执行,除非options指定了选项FindDirectChildrenOnly。

如果有多个子代匹配搜索,则返回最直接的祖先。如果有几个最直接的祖先,将返回children() 中的第一个子代。在这种情况下,最好使用 findChildren()来获取所有孩子的完整列表。 本示例返回parentWidget的名为“button1”的子级 QPushButton,即使该按钮不是父级的直接子级:

此示例返回parentWidget的QListWidget子级:

此示例返回parentWidget(其直接父级)的名为“button1”的子级q button:

此示例返回其直接父级parentWidget的QListWidget子级:

QListfindChildren(const QString &name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const

返回具有给定名称name的此对象的所有子级,这些子级可以转换为T类型;如果没有这样的对象,则返回一个空列表。空name参数导致匹配所有对象,空参数只匹配objectName为空的对象。搜索以递归方式执行,除非options指定了选项FindDirectChildrenOnly。

以下示例显示了如何查找名为widgetname的指定parentWidget的子QWidgets列表:

本示例返回parentWidget的所有子级QPushButtons:

本示例返回parentWidget的所有直接子级QPushButtons:

QListfindChildren(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
重载。返回此对象的所有可转换为T类型的子级;如果没有这样的对象,则返回一个空列表。搜索以递归方式执行,除非options指定了选项FindDirectChildrenOnly。
QListfindChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const
重载。返回此对象的子对象,这些子对象可以转换为T类型,并且其名称与正则表达式re匹配;如果没有这样的对象,则返回一个空列表。搜索以递归方式执行,除非options指定了选项FindDirectChildrenOnly。
boolinherits(const char *className) const

如果此对象是继承className的类或继承className的QObject子类的实例,则返回true否则返回false。 一个类被认为是继承自身。

如果需要确定某个对象是否是特定类的实例以便对其进行转换,请考虑改用 qobject_cast<Type *>(object) instead。

voidinstallEventFilter(QObject *filterObj)

在此对象上安装事件筛选器filterObj。例如:

事件筛选器是一个对象,它接收发送到该对象的所有事件。过滤器可以停止事件或将其转发给该对象。事件过滤器filterObj通过其eventFilter()函数接收事件。如果应该过滤事件(即停止),eventFilter()函数必须返回true否则它必须返回false。 如果在一个对象上安装了多个事件过滤器,则最后安装的过滤器将首先被激活。 如果已经为该对象安装了filterObj,此函数将移动它,使其如同最后安装的一样。

这里有一个KeyPressEater类,它接受被监视对象的按键:

下面是如何在两个控件上安装它:

例如,QShortcut类使用这种技术来拦截快捷键的按下。

警告:如果删除eventFilter() 函数中的receiver对象,请确保返回true。如果返回false,Qt会将事件发送给已删除的对象,程序将崩溃。

请注意,筛选对象必须与此对象在同一个线程中。如果filterObj在不同的线程中,则该函数不执行任何操作。如果filterObj或此对象在调用此函数后被移动到不同的线程,则事件过滤器将不会被调用,直到两个对象再次具有相同的线程关联(它不会被删除)。

参见 :removeEventFilter(), eventFilter(), and event().

boolisQuickItemType() const
如果对象是QQuickItem,则返回true否则返回false。 调用此函数等效于调用inherits("QQuickItem"),只不过它要快得多。
boolisWidgetType() const
如果对象是widget,则返回true否则返回false。 调用这个函数相当于调用inherits("QWidget"),只不过它要快得多。
boolisWindowType() const
如果对象是窗口,则返回true否则返回false。 调用这个函数相当于调用inherits("QWindow"),只不过它要快得多。
voidkillTimer(int id)
终止计时器标识符为id的计时器。 计时器事件启动时,startTimer()会返回计时器标识符。
virtual const QMetaObject *metaObject() const

返回指向此对象的元对象的指针。 元对象包含关于继承QObject的类的信息,例如类名、超类名、属性、信号和槽。每个包含Q_OBJECT宏的QObject子类都有一个元对象。 信号/插槽连接机制和属性系统需要元对象信息。inherits() 函数也利用了元对象。 如果您没有指向实际对象实例的指针,但仍想访问类的元对象,则可以使用staticMetaObject

voidmoveToThread(QThread *targetThread)

更改该对象及其子对象的线程关联。如果对象有父对象,则不能移动。事件处理将在targetThread中继续。 要将对象移动到主线程,请使用 QApplication::instance()检索指向当前应用程序的指针,然后使用QApplication::thread() 检索应用程序所在的线程。例如:

如果targetThread为nullptr,则此对象及其子对象的所有事件处理都会停止,因为它们不再与任何线程关联。

请注意,该对象的所有活动计时器都将被重置。计时器首先在当前线程中停止,然后在targetThread中重新启动(时间间隔相同)。因此,在线程之间不断移动对象会无限期推迟计时器事件。

就在线程关联更改之前, QEvent::ThreadChange 事件被发送到该对象。您可以处理此事件来执行任何特殊处理。

请注意,如果targetThread不是nullptr,则发送到该对象的任何新事件都将在target thread中处理,当它为nullptr时,不会对此对象或其子对象进行事件处理,因为它们不再与任何线程关联。

警告:此函数不是线程安全的;当前线程必须与当前线程相似性相同。换句话说,这个函数只能将一个对象从当前线程“推”到另一个线程,而不能将一个对象从任意线程“拉”到当前线程。但是这个规则有一个例外:没有线程关联的对象可以被“拉”到当前线程。

QStringobjectName() const

注意:该属性支持QProperty绑定。

该属性保存该对象的名称 您可以使用 findChild()通过名称(和类型)来查找对象。您可以使用 findChildren()找到一组对象。

默认情况下,此属性包含一个空字符串。

QObject *parent() const
返回指向父对象的指针。
QVariantproperty(const char *name) const
返回对象的name属性的值。 如果不存在这样的属性,则返回的变量无效。 有关所有可用属性的信息通过元对象metaObject() 和动态属性名 dynamicPropertyNames()提供。
voidremoveEventFilter(QObject *obj)
从该对象中移除事件过滤器对象obj。如果没有安装这样的事件过滤器,将忽略该请求。 销毁该对象时,该对象的所有事件过滤器都会自动删除。 即使在事件过滤器激活期间(即从eventFilter() 函数中),删除事件过滤器始终是安全的。
voidsetObjectName(const QString &name)
voidsetObjectName(QAnyStringView name)
将对象的名称设置为name
voidsetParent(QObject *parent)
使对象成为父对象 parent的子对象。
boolsetProperty(const char *name, const QVariant &value)
boolsetProperty(const char *name, QVariant &&value)

将对象的name属性的值设置为value。

如果使用 Q_PROPERTY 在类中定义属性,则成功时返回true,否则返回false。

如果属性不是使用 Q_PROPERTY 定义的,因此没有在元对象中列出,它将作为动态属性添加并返回false。

有关所有可用属性的信息通过元对象metaObject() 和动态属性名 dynamicPropertyNames() 提供。

可以使用property() 再次查询动态属性,并且可以通过将属性值设置为无效的 QVariant来移除动态属性。更改动态属性的值会导致向对象发送QDynamicPropertyChangeEvent

注意:以“_q_”开头的动态属性仅供内部使用。

boolsignalsBlocked() const
如果信号被阻止,则返回true否则返回false。 默认情况下,信号不会被阻止。
intstartTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer)

重载。将启动一个timerType类型的计时器,时间间隔为毫秒。这相当于调用:

intstartTimer(std::chrono::milliseconds interval, Qt::TimerType timerType = Qt::CoarseTimer)

重载。启动计时器并返回计时器标识符,如果无法启动计时器,则返回零。

在调用 killTimer() 之前,每隔一段时间就会发生一次计时器事件。如果 interval  等于std::chrono::duration::zero(),那么每当不再有窗口系统事件需要处理时,timerEvent() 就会发生一次。

当计时器事件发生时,使用QTimerEvent 事件参数类调用虚拟 timerEvent() 函数。重新实现此函数以获取计时器事件。 如果多个计时器正在运行,可以使用QTimerEvent::timerId() 来找出哪个计时器被激活。

请注意,QTimer 的准确性取决于底层操作系统和硬件。timerType参数允许您自定义计时器的精度。有关不同定时器类型的信息,请参见 Qt::TimerType。大多数平台支持20毫秒的精度;有些提供更多。如果Qt无法传递请求数量的计时器事件,它将默默地丢弃一些事件。

QTimer类提供了一个高级编程接口,用单次定时器和定时器信号代替事件。还有一个QBasicTimer类,它比QTimer更轻量级,比直接使用timer IDs更灵活。

QThread *thread() const
返回对象所在的线程。

 公共槽函数 

voiddeleteLater()

计划删除此对象。

当控制返回到事件循环时,该对象将被删除。如果调用此函数时事件循环没有运行(例如在QCoreApplication::exec()之前对某个对象调用deleteLater),则一旦事件循环开始,该对象将被删除。如果在主事件循环停止后调用deleteLater(),则不会删除对象。如果对没有运行事件循环的线程中的对象调用deleteLater(),则该对象将在线程结束时被销毁。

注意,进入和离开新的事件循环(例如,通过打开模式对话框)将不会执行延迟删除;对于要删除的对象,控件必须返回到调用deleteLater()的事件循环。这不适用于在先前的嵌套事件循环仍在运行时删除的对象:一旦新的嵌套事件循环开始,Qt事件循环将删除这些对象。在Qt没有通过 QCoreApplication::exec() 或QEventLoop::exec() 驱动事件调度程序的情况下,不会自动处理延迟删除。为了确保在这种情况下延迟删除,可以使用以下解决方法:

注意:多次调用该函数是安全的;当传递第一个延迟删除事件时,将从事件队列中删除该对象的任何未决事件。


 信号 

voiddestroyed(QObject *obj = nullptr)

该信号在对象obj被销毁之前发出,在QPointer的任何实例被通知之后发出,并且不能被阻止。

该信号发出后,所有对象的子对象都会立即被销毁。

voidobjectNameChanged(const QString &objectName)

该信号在对象名称更改后发出。新的对象名称作为object name传递。

注意:这是一个私人信号。它可以用于信号连接,但不能由用户发射。

注意:属性objectName的通知信号。


 静态公有成员 

QMetaObject::Connectionconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection)

侦测signal 信号,创建从发送对象 sender 到接收对象 receiver 的给定type类型连接,并调用 method 函数 。返回连接的句柄,该句柄可用于以后断开连接。

指定 signal 和method时必须使用宏SIGNAL()SLOT() 

QLabel *label = new QLabel;
QScrollBar *scrollBar = new QScrollBar;
QObject::connect(scrollBar, SIGNAL(valueChanged(int)),
                 label,  SLOT(setNum(int)));

此示例确保标签始终显示当前滚动条值。请注意,signal 和 slots 参数不得包含任何变量名称,只能包含类型。例如,以下内容将不起作用并返回 false:

// WRONG
QObject::connect(scrollBar, SIGNAL(valueChanged(int value)),
                 label, SLOT(setNum(int value)));

一个信号也可以连接到另一个信号:

在此示例中,构造函数“中继”来自私有成员变量的信号。

一个信号可以连接到许多插槽和信号。

许多信号可以连接到一个插槽。

如果一个信号连接到多个插槽,则在发射信号时,这些插槽将按照建立连接的相同顺序激活。

如果该函数成功将信号连接到插槽,则返回一个表示连接的QMetaObject::Connection 函数。如果连接句柄无法创建连接,例如,如果无法验证是否存在 signal 或  method,或者它们的签名不兼容,则连接句柄将无效。您可以通过将句柄转换为布尔值来检查句柄是否有效。

默认情况下,您建立的每个连接都会发出一个信号,重复连接会发出两个信号。您可以通过 disconnect() 调用断开所有这些连接。如果连接类型是 Qt::UniqueConnection,则只有在连接不重复时才会建立连接。如果已经存在重复的信号(在相同对象上完全相同的插槽中发出完全相同的信号),则连接将失败,连接将返回无效的QMetaObject::Connection

Qt::UniqueConnection不适用于 lambda、非成员函数和仿函数 ,它们仅适用于连接到成员函数。

可选参数描述要建立的连接类型。特别是,它确定特定信号是立即传送到插槽还是排队等待稍后传送。如果信号是排队的,参数必须是Qt的元对象系统已知的类型,因为Qt需要复制参数以将它们存储在幕后的事件中。如果您尝试使用排队连接会收到错误消息。

QObject::connect: Cannot queue arguments of type 'MyType'
(Make sure 'MyType' is registered using qRegisterMetaType().)

在建立连接之前,调用qRegisterMetaType() 注册数据类型。

See also disconnect(), sender(), qRegisterMetaType(), Q_DECLARE_METATYPE(), and Differences between String-Based and Functor-Based Connections.

QMetaObject::Connectionconnect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method, Qt::ConnectionType type = Qt::AutoConnection)

侦测signal 信号,创建从发送对象 sender 到接收对象 receiver 的给定type类型连接,并调用 method 函数 。返回连接的句柄,该句柄可用于以后断开连接。

如果 Connection 句柄无法创建连接,则它将无效。例如:参数无效。您可以通过将QMetaObject::Connection 转换为布尔值来检查它是否有效。

QMetaObject::Connection

connect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method, Qt::ConnectionType type = Qt::AutoConnection)

PointerToMemberFunction(指向成员函数的指针)
QMetaObject::Connectionconnect(const QObject *sender, PointerToMemberFunction signal, Functor functor)

该信号必须是在标头中声明为信号的函数。槽函数可以是任何可以连接到信号的函数或仿函数。如果信号的参数与槽函数一样多(也可以多于),则槽函数可以连接到给定的信号。信号和槽中相应参数的类型之间必须存在隐式转换。

如果发送方被破坏,连接将自动断开。但是,在发出信号时,应注意函数或仿函数中使用的任何对象仍然处于活动状态。

QMetaObject::Connection

connect(const QObject *sender, PointerToMemberFunction signal, const QObject *context, Functor functor, Qt::ConnectionType type = Qt::AutoConnection)
bool

disconnect(const QObject *sender, const char *signal, const QObject *receiver, const char *method)

断开信号和槽的连接。如果连接成功断开,则返回true;否则返回false 。

当所涉及的任一对象被破坏时,信号槽连接将被移除。

disconnect() 通常以三种方式使用,如以下示例。

1.断开连接到特定对象的所有连接:

disconnect(myObject, nullptr, nullptr, nullptr);
//下面是它非静态的重载
myObject->disconnect();

2.断开连接到特定信号的所有连接:

disconnect(myObject, nullptr, nullptr, nullptr);
//下面这是相当于它非静态的重载
myObject->disconnect(SIGNAL(mySignal()));

3.断开特定接收对象的连接:

disconnect(myObject, nullptr, myReceiver, nullptr);
//下面这是相当于它非静态的重载
myObject->disconnect(myReceiver);

nullptr可用作通配符,分别表示“任何信号”、“任何接收对象”或“接收对象中的任何插槽”。
signal可能永远不会是nullptr(不能在单个调用中断开来自多个对象的信号)。
signal 如果是 nullptr ,则断开receiver和method与所有信号的连接。否则,仅断开指定的信号。
receiver 如果是 nullptr ,则断开任何连接到 signal的连接。否则,其他对象中的槽不会断开连接。
method 如果是nullptr  ,则断开连接到 receiver的所有连接。否则,将仅断开指定的槽,而所有其他槽将单独保留。

注意: 断开所有信号槽连接也将断开 QObject::destroyed() s信号(如果已连接)。这样做可能会对依赖此信号清理资源的类产生负面影响。建议仅断开通过应用程序代码连接的特定信号。

booldisconnect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method)

参考上一条。此外:如果出现以下情况,此函数将返回 false,并且没有信号和插槽断开连接:

1.signal 不是发送类sender 或其父类之一的成员。
2.method不是接收类 receiver 或其父类之一的成员。
3.signal 不是一个信号。
QMetaMethod() 可以用作通配符,表示“任何信号”或“接收对象中的任何插槽”。以同样的方式可以用于“任何接收对象”的意思。在这种情况下,方法也应该是 QMetaMethod()。

booldisconnect(const QMetaObject::Connection &connection)
booldisconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method)
const QMetaObjectstaticMetaObject

当信号signal 与对象断开连接时,将调用此虚函数。

警告: 此功能违反了面向对象的模块化原则。它可能有助于优化对昂贵资源的访问。

这个函数是从执行断开连接的线程调用的,该线程可能与此对象所在的线程不同。此函数也可以在内部互斥锁锁定的情况下调用。因此,不允许从重新实现中的函数中重新输入任何函数,包括 isSignalConnected()。如果在重新实现中锁定互斥锁,请确保不要在其他地方使用该互斥锁调用函数,否则将导致死锁。

QStringtr(const char *sourceText, const char *disambiguation = nullptr, int n = -1)

返回用于翻译版本的源文本sourceText。

如果在同一上下文中的不同角色中使用了相同的字符串,则可以传入额外的标识字符串(默认情况下)。


 保护函数 

virtual voidchildEvent(QChildEvent *event)

可以在子类中重新实现此事件处理程序以接收子事件。该事件在event 参数中传递。

在添加QEvent::ChildAdded 或删除 QEvent::ChildRemoved时,将事件发送到对象。在这两种情况下,您都只能依赖子项是 QObject 或者 isWidgetType() 返回true。(这是因为,在这种情况下, ChildAdded 还没有完全构建,ChildRemoved 就已经把它破坏了)。

当子项被润色或添加润色子项时,QEvent::ChildPolished 事件将发送到控件。如果您收到QEvent::ChildPolished 事件,则子项的构建通常已完成。但是,这并不能保证,并且在执行控件的构造函数期间可能会传递多个QEvent::ChildPolished 事件。

对于每个子widget,您都会收到一个 ChildAdded事件、零个或多个ChildPolished事件以及一个ChildRemoved 事件。

如果在添加子项后立即删除该ChildPolished事件,则会省略该事件。如果一个子项在建造和破坏过程中被多次 child polished ,您可能会收到同一个子项的多个QEvent::ChildPolished 事件,每次都使用不同的虚拟桌面。

virtual voidconnectNotify(const QMetaMethod &signal)

当此对象已连接到 signal 时,将调用此虚拟函数。

如果要与特定信号进行比较,可以使用 QMetaMethod::fromSignal() ,如下所示:

if (signal == QMetaMethod::fromSignal(&MyObject::valueChanged)) {
    // 信号是 valueChanged
}

警告: 此功能违反了面向对象的模块化原则。

virtual voidcustomEvent(QEvent *event)
可以在子类中重新实现此事件处理程序以接收自定义事件。自定义事件是用户定义的事件,其类型值至少与QEvent::User 类型枚举中的QEvent::Type 用户项一样大,它通常是一个QEvent子类。该事件在参数 event 中传递。
virtual voiddisconnectNotify(const QMetaMethod &signal)
boolisSignalConnected(const QMetaMethod &signal) const
intreceivers(const char *signal) const
QObject *sender() const
intsenderSignalIndex() const
virtual voidtimerEvent(QTimerEvent *event)
它是QObject类中唯一的事件处理器函数,可以在子类中重新实现,以接收对象的计时器事件。

QObjectList
Tqobject_cast(QObject *object)
Tqobject_cast(const QObject *object)

 宏指令   

QT_NO_NARROWING_CONVERSIONS_IN_CONNECT

信号槽参数禁止窄化转换。例:信号参数为double类型,对应的槽函数类型为int,信号槽关联后运行起来是没问题的(隐式转换),在槽函数中处理时double值会窄化转成int值。

如果在pro文件加入此宏:

DEFINES += QT_NO_NARROWING_CONVERSIONS_IN_CONNECT

编译就会报错。

Q_CLASSINFO(NameValue)

给类设置额外信息。信息是两个字串,一个作为名字,一个作为值。

class MyClass : public QObject
{
    Q_OBJECT
    Q_CLASSINFO("Author", "Pierre Gendron")
    Q_CLASSINFO("URL", "http://www.my-organization.qc.ca")

public:
    ...
};

Q_EMIT

Q_EMIT的效果和emit一样。一些第三方库如boost会使用emit作为关键字。如果使用了这些第三方库则使用此宏代替emit。Q_SIGNAL、Q_SLOT、Q_SIGNALS、Q_SLOTS类似。

注:使用之前在pro文件中添加:

  CONFIG += no_keywords
Q_ENUM(...)

向元对象系统注册枚举,必须放在 Q_OBJECT 和 Q_GADGET 的声明后面。

    enum class Priority { High, Low, VeryHigh, VeryLow };
    Q_ENUM(Priority)

注册过后的枚举可以用qDebug直接打印出来,key和value互转也很方便。

Q_ENUM_NS(...)
Q_FLAG(...)
Q_FLAG_NS(...)
Q_GADGET

对于不继承QObject但仍希望使用 QMetaObject 提供的某些反射功能的类,Q_GADGET 宏是Q_OBJECT宏的轻量级版本。与Q_OBJECT宏一样,它必须出现在类定义的私有部分中。

Q_GADGET可以具有Q_ENUM、Q_PROPERTY、Q_INVOKABLE,但不能有信号或槽。

Q_GADGET使类成员staticMetaObject可用。staticMetaObject类型为QMetaObject。

Q_GADGET_EXPORT(EXPORT_MACRO)
Q_INTERFACES(...)

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

Q_INVOKABLE

将此宏应用于成员函数的声明,以允许通过元对象系统调用它们。宏写在返回类型之前。

  class Window : public QWidget
  {
      Q_OBJECT
 
  public:
      Window();
      void normalMethod();
      Q_INVOKABLE void invokableMethod();
  };
Q_MOC_INCLUDE
Q_NAMESPACE
Q_NAMESPACE_EXPORT(EXPORT_MACRO)
Q_OBJECT此宏必须出现在类定义的private部分,使用此宏可以声明自己的信号和槽、使用Qt的元对象系统。这个宏要求类是QObject的子类。
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)

Q_REVISION

设置槽函数和属性在元对象系统中的修订版本。

Q_SET_OBJECT_NAME(Object)把一个对象变量名(指针变量也可以)设为对象的objectName。(QObject及其子类才有用)
Q_SIGNAL避免与第三方库命名冲突。
Q_SIGNALS避免与第三方库命名冲突。
Q_SLOT避免与第三方库命名冲突。
Q_SLOTS避免与第三方库命名冲突。

<<< 返回根页面

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值