QObject类

Qt入门教程【QObject篇】QObject类 QObject类 阅读详情

 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(sender, signal, this, method, type)。 您建立的每个连接都会发出一个信号,因此重复的连接会发出两个信号。您可以使用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(Name, Value)

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

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避免与第三方库命名冲突。

<<< 返回根页面

Qt的QObject类 如有进一步的疑问,请参考Qt的官方文Qt中,QObject的属性系统可以让你为对象添加属性,并提供了属性的读取和写入功能。总之,QObject的元对象系统通过在编译阶段和运行时生成和使用额外的元对象数据,实现了对象的反射功能。通过QObject的属性系统,你可以为对象添加自定义的属性,并通过统一的接口进行属性的读写操作。这些元对象数据包括类的名称、父类的名称、信号和槽的信息、属性的信息等。元对象的注册:在创建元对象后,Qt会将其注册到全局的元对象表中,以便在运行时能够根据类名查找和使用元对象。 阅读详情

相关推荐

SpringBoot+Flowable 6.8.0实战:5分钟搞定免登录流程图设计器

本文详细介绍了如何通过SpringBoot与Flowable 6.8.0深度整合,快速实现免登录流程图设计器的集成方案。通过排除默认安全配置、自定义安全策略和用户模拟服务,开发者可在5分钟内完成设计器的部署,适用于快速原型开发和企业内部工具搭建。

weixin_29204205的博客 279

QObject类介绍

作为所有Qt类的基类,QObject提供了信号槽机制、对象树、动态属性、元对象系统、事件处理机制、线程安全、国际化等许多重要特性,这些特性可以帮助开发者轻松实现模块间通信、组件化、程序设计以及事件处理等方面的功能。在Qt框架下编程,不管用不用到Qt的特性,都推荐自定义类继承QObject类,这样在需要的时候,就可以随时使用Qt基于QObject类提供的各种特性和机制,而且可以让自定义的类很好地融入到Qt的框架之中。QObject用得好,可以做很多需要运行时动态处理的工作,大大地提高程序的灵活性。

zw_ggr_2017的博客 3593

双模音频解码器设计:USB+蓝牙LDAC平衡输出方案

音频解码器是数字音频系统中实现数模转换的核心组件,其性能直接决定音质保真度与系统延迟。基于高集成SoC的解码方案通过统一时钟域与片内DSP处理,有效抑制Jitter并简化硬件拓扑;结合全平衡模拟输出架构,可显著提升共模抑制比(CMRR)与信噪比(SNR)。该技术路径广泛应用于便携式Hi-Res音频设备、USB-C小尾巴DAC及蓝牙高解析耳机放大器等场景。本文围绕ES9038Q2M双模SoC展开,详解其在LDAC协议支持、UAC2.0兼容性及平衡电流型DAC输出方面的工程实现,为高性能、可量产音频硬件开发提供

weixin_42613018的博客 388

QObject类详述

QObject类详述QObject类从Qt类继承,是所有Qt对象的基类,Qt类含有全局需要的各种枚举类型、类型的定义。通常情况下,用户不需要关心这个类,因为它是QObject及很少几个类的基类。例如:它定义了枚举类型ButtonState说明了鼠标按钮的状态,它定义了枚举类型WidgetState说明了窗口部件状态等。1、对象树QObject类是所有Qt对象的基类,是Qt对象模型的核心。 通过QO...

fascinateu的博客 2316

自动驾驶必备:5分钟搞懂gPTP如何实现μs级时间同步(附开源代码)

本文深入解析了gPTP协议在自动驾驶系统中实现微秒级时间同步的核心机制与工程实践。针对多传感器融合与跨域协同的严苛需求,文章拆解了gPTP的频率同步、对等延迟测量与时间偏移校正三步流程,并提供了基于linuxptp和AVnu gPTP两大开源代码库的实战配置指南与性能评估方法,助力开发者构建高精度、高可靠的车载时间同步网络。

weixin_29211309的博客 167

Simlink与PX4硬件在环仿真(HIL)实现

Simlink与PX4硬件在环仿真(HIL)实现 介于涉及的知识比较多,这里只是简单的介绍一下,更多内容可以参考阿木实验室《基于matlab模型开发》课程。 硬件在环HIL介绍 simlink与PX4通信实现 硬件在环HIL介绍 为来贯彻万物都可以用数学公式表示,我们以simlink的角度来看我们的无人机,那么UAV可以分为以下的几个模块: 传感器模型 滤波器模块 控制器模...

Zipout的博客 6210

QObject

QObject

友善啊,朋友的博客 3920

【例1896】report all clearance datasets 报告所有间隙数据集

report all clearance datasets 报告所有间隙数据集》这是一个NX二次开发官方小例子,下面是代码和解析。相较于混乱、未经验证的代码,官方案例能够确保开发者获得准确的开发方法,这些官方示例代码经过严格测试,能够正确地反映出NX软件的功能和API使用方式,有助于开发者系统地掌握NX二次开发技能,提高开发质量和效率。本专栏订阅后是永久阅读的。欢迎一起学习NX二次开发案例,逐步积累宝贵的经验,早日成为行业专家。

王牌飞行员_里海的博客 644

Qt类 | QObject类详解

所有的 Qt 控件都继承自QObject。Header:qmake:QT += core事件处理QObject提供了事件处理机制,允许对象接收和处理不同类型的事件,如鼠标点击、键盘输入等。QObject对象可以使用用于接收和处理各种事件,可以被子类重写以自定义事件处理。还可以通过installEventFilter()和eventFilter()函数来过滤或拦截其他对象的事件。信号和槽QObject支持 Qt 的信号和槽机制,允许对象之间进行通信。connect()方法用于建立信号和槽之间的连接,而。

zwcslj的博客 2558

论文必备 - YOLOv8训练前一键扩充数据集,支持9种扩充方法,支持图像和标签同步扩充

在网络模型训练前,大量的数据集是必备的。而对于一些特殊场景中的特殊目标,大量的数据集往往难以获取,无法满足模型训练的基本需求。本文提供了,脚本可一键运行,。

Limiiiing的博客 769

YOLOv8改进 | Conv篇 | 利用YOLOv9的GELAN模块替换C2f结构(附轻量化版本 + 高效涨点版本 + 结构图)

本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的GELAN模块来改进YOLOv8中的C2f,GELAN融合了CSPNet和ELAN机制同时其中利用到了RepConv在获取更多有效特征的同时在推理时专用单分支结构从而不影响推理速度,同时本文的内容提供了两种版本一种是参数量更低涨点效果略微弱一些的版本(参数量V8n下降80w,计算量为6.1GFLOPs),另一种是参数量稍多一些但是效果要不参数量低的效果要好一些(均为我个人整理),提供两种版本是为了适配不同需求的读者,具体选择

Snu77的博客 7567

【Qt】QObject详解

00. 目录 文章目录00. 目录01. 概述02. 线程亲和性03. 没有拷贝构造函数或赋值运算符04. 自动连接05. 动态属性06. 国际化07. 属性文档08. 常用成员方法09. 附录 01. 概述 QObject类是所以Qt类的基类,也是Qt对象模型的核心。这个模型中的核心特性就是能让对象键无缝通信的信号和槽的机制。我们可以使用connect()函数将一个信号连接到一个槽上,也可以使用disconnect()删除这个连接。为了防止无休止的的信号通知,还可以使用blockSignals()来临时阻

C/C++软件工程师、嵌入式软件工程师、物联网研发工程师、C/C++讲师、物联网讲师、嵌入式讲师、鸿蒙讲师---欢迎大家一起交流(私信添加博主微信) 7889

Python爬取上市公司年报并进行财务比率分析:基于异步爬虫与数据挖掘的实战

在当今数据驱动的投资时代,获取并分析上市公司财务数据对于投资者、分析师和研究人员至关重要。中国证监会指定的上市公司信息披露网站——巨潮资讯网,包含了所有A股上市公司的年报、季报及其他公告信息。本项目将展示如何使用Python最新技术栈爬取巨潮网的年报数据,提取关键财务指标,并进行深入的财务比率分析。本文将采用异步爬虫技术提高数据采集效率,使用现代解析库处理PDF和HTML文档,并结合pandas进行数据分析和可视化。整个过程将遵循合规合法的爬虫伦理,尊重网站robots.txt协议,设置合理的请求间隔。

2201_76125261的博客 666

Qt框架之QObject类&QString类

需要注意的是,`QString` 是 Qt 框架特有的字符串类,与标准库中的 `std::string` 类型并不直接兼容。但是,`QString` 提供了与 `std::string` 之间的相互转换方法,可以方便地在 Qt 代码和标准库代码之间进行字符串的转换。格式化字符串:`QString`持类似于 printf 的格式化字符串功能,可以方便地插入变量或格式化输出。字符串操作:`QString` 提供了丰富的字符串操作方法,包括连接、分割、查找、替换、转换大小写等。

CSUC的博客 579

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Qt自己添加新类并继承QObject

今天用Qt自己添加新类时发现新类并不继承QObject,鼓捣了一上午终于明白过来。 一开始我是直接右键头文件夹,然后点击添加新文件,然后选C++ class, class name命名为自己的,Base class一开始也用的自己的,其实这样就不会让类继承自QObject,Base class要选QObject,这样才能继承自QObject,然后点击下一步,生成头文件和源文件。 生成...

CreatorWill的博客 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Qt-QObject类学习

QObject类学习。

qq_45441318的博客 1123

QObject类详解

每个 QObject 都可以有(至多)一个父 QObject ,且可以拥有任意数量的子 QObject, 换句话说,每个子对象的类 型必须是 QObject 或者必须派生自 Q Object。任何一个QObject 对象都可以组成一个树形结构,每个节点都是一个 QObject 对象,子节点可以是其他 QObject 对象。每个 QOb ject 父对象都会管理自己的子对象, 这就意味着,在调用 QObject 的析构函数时会自动销毁该对象的子对象。每个父对象都知道它的子对象的地址。

zxf347085420的博客 218

1.QObject类

简述 QObject类是所有Qt对象的基类。 QObject是Qt对象模型的核心。该模型的核心特征是称为信号和槽的对象通信机制。您可以使用connect()将信号连接到槽,并用disconnect()终止该连接。为了避免信号死循环,你可以调用blockSignals()去终止该对象的信号发射。保护类型函数connectNotify()和disconnectNotify()可以跟...

dd19921114的博客 270

qt qthread类和qobject类

QThread从QObject派生。它发出信号来表明线程开始了或结束了。并且也提供了几个槽。更有趣的是,QObject可以在多个程中同时使用,可以发出信号给另外线程的槽,以及向“活在”另外线程中的对象邮寄事件。以上之所以能发生,是因为每个初程都被允许拥有它自己的事件循环。QObject 重入 QObject是可重入的。它大多数非界面派生类,比如QTimer,QTcpSocket,QFtp,和QPr

Linux痞子 1629

Qt中QObject类的核心作用与使用

QObject是Qt框架的核心基类,提供对象树管理、信号槽机制和元对象系统三大核心功能。对象树管理通过父子关系自动处理内存释放;信号槽机制实现对象间通信;元对象系统支持运行时类型信息和动态属性。QObject还包含对象名称管理、事件处理、生命周期控制等实用功能,并支持自定义属性和工厂模式等高级应用。掌握QObject是深入理解Qt编程的基础,其特性为Qt应用程序开发提供了强大的对象管理和通信能力。

编程与实战的博客 1092

关于 QObject 类

1.QObject类 简述 QObject类是所有Qt对象的基类。 QObject是Qt对象模型的核心。该模型的核心特征是称为信号和槽的对象通信机制。您可以使用connect()将信号连接到槽,并用disconnect()终止该连接。为了避免信号死循环,你可以调用blockSignals()去终止该对象的信号发射。保护类型函数connectNotify()和disconn...

weixin_30530523的博客 307

《QT 108好类》之8 QObject类

《QT 108好类》之8 QObject类摘要: QObject是Qt框架的核心基类,提供对象通信、内存管理等关键功能。主要特性包括:1)信号槽机制实现对象间通信;2)对象树自动内存管理;3)事件处理系统;4)动态属性系统。通过Q_OBJECT宏启用元对象特性,MOC编译器生成支持代码。QObject还提供运行时类型信息(qobject_cast)和父子对象管理,是Qt事件驱动架构的基础,大多数Qt类都直接或间接继承自QObject。

qq_43550409的博客 465

Pyside6 的QObject 类

PySide6 中的QObject是 Qt 框架的核心基类,所有需要信号与槽、事件处理、内存管理的对象均需要继承自它。以下是关于QObjectQObject:由对象发射的事件(如按钮点击)。:接收信号并处理的方法。

燃灯工作室 585

Qt类总结(二)QObject

1.QObject简介 Header: #include < QObject > qmake: QT += core Inherited By: QAbstractAnimation, QAbstractEventDispatcher, QAbstractItemModel, QAbstractState, QAbstractTransition, QCoreApplication, QEventLoop, QFileSelector, QFileSystemWatcher, QIODevice

AAAA202012的博客 1710
上一篇: QEvent类
下一篇: QObject【详细描述】
floatbit
博客等级 码龄24年 460粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值