QObject类

Android 车载应用开发与优化(1) - CarLauncher 核心功能与动态集成探秘 本文深入探讨了Android车载应用开发中CarLauncher的核心功能与实现原理。作为车载系统的“脸面”,CarLauncher不仅提供应用入口,更通过动态集成技术将地图、音乐等关键信息嵌入桌面,以保障驾驶安全与体验。文章详细解析了其源码结构、权限配置、应用启动机制以及基于Activity嵌入的动态集成黑魔法,为开发者提供了从基础认识到高级优化的完整指南。 阅读详情

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

<<< 返回根页面

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

相关推荐

QtQObject

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

Qt历险记,专注Qt技术,三年医疗设备研发经验,1年机器视觉研发经验,半年柔性传感研发经验。 500

QObject介绍

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

zw_ggr_2017的博客 3589

015:机载三维激光扫描技术相关知识

机载三维激光扫描系统(LiDAR)是集激光、GPS、INS等尖端技术于一体的三维航空遥感技术,能高效准确获取地表三维信息。该系统由GPS、INS、激光扫描测距系统、成像装置和工作平台组成,各部件协同工作以获取精确的空间定位、运动状态、地表三维坐标及真实色彩信息。通过制定飞行计划、安置GPS基站、激光扫描测量、惯性测量及获取高清数码影像等步骤,机载LiDAR技术能实时获取大范围高精度三维数据。该技术具有扫描速度快、精度高、全数字特征等优势,广泛应用于测绘、工程、环境监测和城市建设等领域,如城市三维模型重建、灾

qq_31762031的博客 1702

QObject详述

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

fascinateu的博客 2314

QObject

QObject

友善啊,朋友的博客 3908

Qt | QObject详解

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

zwcslj的博客 2554

QtQObject详解

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

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

Qt框架之QObject&QString

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

CSUC的博客 577

Qt自己添加新并继承QObject

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

CreatorWill的博客 1万+

Qt-QObject学习

QObject学习。

qq_45441318的博客 1118

QObject详解

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

zxf347085420的博客 216

1.QObject

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

dd19921114的博客 268

qt qthreadqobject

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

Linux痞子 1623

QtQObject的核心作用与使用

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

编程与实战的博客 1085

关于 QObject

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

weixin_30530523的博客 299

QT 108好》之8 QObject

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

qq_43550409的博客 464

Pyside6 的QObject

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

燃灯工作室 580

Qt总结(二)QObject

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

AAAA202012的博客 1704

群联PS3111-S11-13主控芯片 开卡,量产

群联PS3111-S11-13开卡,量产,micron镁光颗粒用FWM,东芝TOSHIBA用FWT。百份百可用。

上一篇: QEvent类
下一篇: QObject【详细描述】
floatbit
博客等级 码龄24年 460粉丝 47原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值