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多个派生类(略) |
提示:所有函数都是可重入的。
详细描述>>>
属性
- objectName : QString
用来包含对象的名称,当要查找子对象时可以使用findChild()通过对象名称查找对象。默认此属性为空。
公有函数
QObject(QObject *parent = nullptr) | |
构造函数。parent是父对象指针,当它为nullptr将构造一个没有父对象的对象。如果对象是一个QWidget,它将成为一个顶级窗口。这个函数可以通过元对象系统和QML调用。 注意:当构造时通过parent提供了父对象,新创建的QObject对象会将自己添加到父对象的children()列表,当父对象析构时,列表中的所有对象也会被析构。这就是Qt中“对象树”的概念,它在一定程度上解决了内存回收问题。
参见: parent(), findChild() 和 findChildren()。 | |
virtual | ~QObject() |
QBindable | bindableObjectName() |
注意:该属性支持QProperty绑定。 该属性保存该对象的名称,您可以使用findChild()通过名称(和类型)来查找对象。您可以使用findChildren()找到一组对象。 此属性默认包含一个空字符串。 | |
bool | blockSignals(bool block) |
如果block 为 true,则此对象发出的信号将被阻止(即:发出信号不会调用与其连接的任何内容)。如果为 false,则不会发生此类阻塞。signalsBlocked()用于返回当前是否处于阻塞状态。 注意:对象的销毁destroyed()信号,是无法被阻塞的。 被阻塞时发出的信号不会被缓冲。 | |
const QObjectList & | children() const |
返回子对象的列表,其返回值QObjectList对象在 添加的第一个子项是列表中的 first 对象,最后添加子项是列表中的 last 对象,即总是在末尾附加新的子项。 注意:列表顺序在以下情况下会发生变化。当QWidget的孩子在控件堆栈中提高 raised或降低 lowered时。提升的控件将成为列表中的最后一个对象,降低的控件将成为列表中的第一个对象。 | |
QMetaObject::Connection | connect(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()断开连接。 注意:这个函数是线程安全的。 | |
bool | disconnect(const char *signal = nullptr, const QObject *receiver = nullptr, const char *method = nullptr) const |
断开 signal-slot 的连接。 当涉及的任何一个对象被销毁时,信号插槽连接就会被删除。 注意:断开所有 signal-slot 连接也将断开QObject::destroyed()信号(如果已连接)。这样做会对依赖该信号清理资源的类产生负面影响。建议仅断开由应用程序代码连接的特定信号。 | |
bool | disconnect(const QObject *receiver, const char *method = nullptr) const |
将此对象中的所有signal-slot 的连接断开。 | |
void | dumpObjectInfo() const |
转储有关信号连接等的信息。调试输出。 | |
void | dumpObjectTree() const |
将子树转储到调试输出。 | |
QList | dynamicPropertyNames() const |
返回使用setProperty()动态添加到对象的所有属性的名称。 | |
virtual bool | event(QEvent *e) |
virtual bool | eventFilter(QObject *watched, QEvent *event) |
如果此对象watched已作为监视对象的事件过滤器安装,则筛选event事件。【官方示例】 | |
T | findChild(const QString &name = QString(), Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
返回此对象的子对象,该子对象可以转换为T类型,名称为name。如果没有这样的对象,则name为nullptr。空名称参数导致所有对象都匹配。一个空的非null名称仅匹配objectName为空的对象。搜索以递归方式执行,除非options指定了选项FindDirectChildrenOnly。 如果有多个子代匹配搜索,则返回最直接的祖先。如果有几个最直接的祖先,将返回children() 中的第一个子代。在这种情况下,最好使用 findChildren()来获取所有孩子的完整列表。 本示例返回parentWidget的名为“button1”的子级 此示例返回parentWidget的QListWidget子级: 此示例返回parentWidget(其直接父级)的名为“button1”的子级q button: 此示例返回其直接父级parentWidget的QListWidget子级: | |
QList | findChildren(const QString &name, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
返回具有给定名称name的此对象的所有子级,这些子级可以转换为T类型;如果没有这样的对象,则返回一个空列表。空name参数导致匹配所有对象,空参数只匹配objectName为空的对象。搜索以递归方式执行,除非options指定了选项FindDirectChildrenOnly。 以下示例显示了如何查找名为widgetname的指定parentWidget的子QWidgets列表: 本示例返回parentWidget的所有子级QPushButtons: 本示例返回parentWidget的所有直接子级QPushButtons: | |
QList | findChildren(Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
重载。返回此对象的所有可转换为T类型的子级;如果没有这样的对象,则返回一个空列表。搜索以递归方式执行,除非options指定了选项FindDirectChildrenOnly。 | |
QList | findChildren(const QRegularExpression &re, Qt::FindChildOptions options = Qt::FindChildrenRecursively) const |
重载。返回此对象的子对象,这些子对象可以转换为T类型,并且其名称与正则表达式re匹配;如果没有这样的对象,则返回一个空列表。搜索以递归方式执行,除非options指定了选项FindDirectChildrenOnly。 | |
bool | inherits(const char *className) const |
如果此对象是继承className的类或继承className的QObject子类的实例,则返回true否则返回false。 一个类被认为是继承自身。 如果需要确定某个对象是否是特定类的实例以便对其进行转换,请考虑改用 qobject_cast<Type *>(object) instead。 | |
void | installEventFilter(QObject *filterObj) |
在此对象上安装事件筛选器filterObj。例如: 事件筛选器是一个对象,它接收发送到该对象的所有事件。过滤器可以停止事件或将其转发给该对象。事件过滤器filterObj通过其eventFilter()函数接收事件。如果应该过滤事件(即停止),eventFilter()函数必须返回true否则它必须返回false。 如果在一个对象上安装了多个事件过滤器,则最后安装的过滤器将首先被激活。 如果已经为该对象安装了filterObj,此函数将移动它,使其如同最后安装的一样。 这里有一个KeyPressEater类,它接受被监视对象的按键: 下面是如何在两个控件上安装它: 例如,QShortcut类使用这种技术来拦截快捷键的按下。 警告:如果删除eventFilter() 函数中的receiver对象,请确保返回true。如果返回false,Qt会将事件发送给已删除的对象,程序将崩溃。 请注意,筛选对象必须与此对象在同一个线程中。如果filterObj在不同的线程中,则该函数不执行任何操作。如果filterObj或此对象在调用此函数后被移动到不同的线程,则事件过滤器将不会被调用,直到两个对象再次具有相同的线程关联(它不会被删除)。 参见 :removeEventFilter(), eventFilter(), and event(). | |
bool | isQuickItemType() const |
如果对象是QQuickItem,则返回true否则返回false。 调用此函数等效于调用inherits("QQuickItem"),只不过它要快得多。 | |
bool | isWidgetType() const |
如果对象是widget,则返回true否则返回false。 调用这个函数相当于调用inherits("QWidget"),只不过它要快得多。 | |
bool | isWindowType() const |
如果对象是窗口,则返回true否则返回false。 调用这个函数相当于调用inherits("QWindow"),只不过它要快得多。 | |
void | killTimer(int id) |
终止计时器标识符为id的计时器。 计时器事件启动时,startTimer()会返回计时器标识符。 | |
virtual const QMetaObject * | metaObject() const |
返回指向此对象的元对象的指针。 元对象包含关于继承QObject的类的信息,例如类名、超类名、属性、信号和槽。每个包含Q_OBJECT宏的QObject子类都有一个元对象。 信号/插槽连接机制和属性系统需要元对象信息。inherits() 函数也利用了元对象。 如果您没有指向实际对象实例的指针,但仍想访问类的元对象,则可以使用staticMetaObject。 | |
void | moveToThread(QThread *targetThread) |
更改该对象及其子对象的线程关联。如果对象有父对象,则不能移动。事件处理将在targetThread中继续。 要将对象移动到主线程,请使用 QApplication::instance()检索指向当前应用程序的指针,然后使用QApplication::thread() 检索应用程序所在的线程。例如: 如果targetThread为nullptr,则此对象及其子对象的所有事件处理都会停止,因为它们不再与任何线程关联。 请注意,该对象的所有活动计时器都将被重置。计时器首先在当前线程中停止,然后在targetThread中重新启动(时间间隔相同)。因此,在线程之间不断移动对象会无限期推迟计时器事件。 就在线程关联更改之前, QEvent::ThreadChange 事件被发送到该对象。您可以处理此事件来执行任何特殊处理。 请注意,如果targetThread不是nullptr,则发送到该对象的任何新事件都将在target thread中处理,当它为nullptr时,不会对此对象或其子对象进行事件处理,因为它们不再与任何线程关联。 警告:此函数不是线程安全的;当前线程必须与当前线程相似性相同。换句话说,这个函数只能将一个对象从当前线程“推”到另一个线程,而不能将一个对象从任意线程“拉”到当前线程。但是这个规则有一个例外:没有线程关联的对象可以被“拉”到当前线程。 | |
QString | objectName() const |
注意:该属性支持QProperty绑定。 该属性保存该对象的名称 您可以使用 findChild()通过名称(和类型)来查找对象。您可以使用 findChildren()找到一组对象。 默认情况下,此属性包含一个空字符串。 | |
QObject * | parent() const |
返回指向父对象的指针。 | |
QVariant | property(const char *name) const |
返回对象的name属性的值。 如果不存在这样的属性,则返回的变量无效。 有关所有可用属性的信息通过元对象metaObject() 和动态属性名 dynamicPropertyNames()提供。 | |
void | removeEventFilter(QObject *obj) |
从该对象中移除事件过滤器对象obj。如果没有安装这样的事件过滤器,将忽略该请求。 销毁该对象时,该对象的所有事件过滤器都会自动删除。 即使在事件过滤器激活期间(即从eventFilter() 函数中),删除事件过滤器始终是安全的。 | |
void | setObjectName(const QString &name) |
void | setObjectName(QAnyStringView name) |
将对象的名称设置为name。 | |
void | setParent(QObject *parent) |
使对象成为父对象 parent的子对象。 | |
bool | setProperty(const char *name, const QVariant &value) |
bool | setProperty(const char *name, QVariant &&value) |
将对象的name属性的值设置为value。 如果使用 Q_PROPERTY 在类中定义属性,则成功时返回true,否则返回false。 如果属性不是使用 Q_PROPERTY 定义的,因此没有在元对象中列出,它将作为动态属性添加并返回false。 有关所有可用属性的信息通过元对象metaObject() 和动态属性名 dynamicPropertyNames() 提供。 可以使用property() 再次查询动态属性,并且可以通过将属性值设置为无效的 QVariant来移除动态属性。更改动态属性的值会导致向对象发送QDynamicPropertyChangeEvent。 注意:以“_q_”开头的动态属性仅供内部使用。 | |
bool | signalsBlocked() const |
如果信号被阻止,则返回true否则返回false。 默认情况下,信号不会被阻止。 | |
int | startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer) |
重载。将启动一个timerType类型的计时器,时间间隔为毫秒。这相当于调用: | |
int | startTimer(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 |
返回对象所在的线程。 |
公共槽函数
void | deleteLater() |
计划删除此对象。 当控制返回到事件循环时,该对象将被删除。如果调用此函数时事件循环没有运行(例如在QCoreApplication::exec()之前对某个对象调用deleteLater),则一旦事件循环开始,该对象将被删除。如果在主事件循环停止后调用deleteLater(),则不会删除对象。如果对没有运行事件循环的线程中的对象调用deleteLater(),则该对象将在线程结束时被销毁。 注意,进入和离开新的事件循环(例如,通过打开模式对话框)将不会执行延迟删除;对于要删除的对象,控件必须返回到调用deleteLater()的事件循环。这不适用于在先前的嵌套事件循环仍在运行时删除的对象:一旦新的嵌套事件循环开始,Qt事件循环将删除这些对象。在Qt没有通过 QCoreApplication::exec() 或QEventLoop::exec() 驱动事件调度程序的情况下,不会自动处理延迟删除。为了确保在这种情况下延迟删除,可以使用以下解决方法: 注意:多次调用该函数是安全的;当传递第一个延迟删除事件时,将从事件队列中删除该对象的任何未决事件。 |
信号
void | destroyed(QObject *obj = nullptr) |
该信号在对象obj被销毁之前发出,在QPointer的任何实例被通知之后发出,并且不能被阻止。 该信号发出后,所有对象的子对象都会立即被销毁。 | |
void | objectNameChanged(const QString &objectName) |
该信号在对象名称更改后发出。新的对象名称作为object name传递。 注意:这是一个私人信号。它可以用于信号连接,但不能由用户发射。 注意:属性objectName的通知信号。 |
静态公有成员
QMetaObject::Connection | connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type = Qt::AutoConnection) |
侦测signal 信号,创建从发送对象 sender 到接收对象 receiver 的给定type类型连接,并调用 method 函数 。返回连接的句柄,该句柄可用于以后断开连接。
此示例确保标签始终显示当前滚动条值。请注意,signal 和 slots 参数不得包含任何变量名称,只能包含类型。例如,以下内容将不起作用并返回 false: 一个信号也可以连接到另一个信号: 在此示例中,构造函数“中继”来自私有成员变量的信号。 一个信号可以连接到许多插槽和信号。 许多信号可以连接到一个插槽。 如果一个信号连接到多个插槽,则在发射信号时,这些插槽将按照建立连接的相同顺序激活。 如果该函数成功将信号连接到插槽,则返回一个表示连接的QMetaObject::Connection 函数。如果连接句柄无法创建连接,例如,如果无法验证是否存在 signal 或 method,或者它们的签名不兼容,则连接句柄将无效。您可以通过将句柄转换为布尔值来检查句柄是否有效。 默认情况下,您建立的每个连接都会发出一个信号,重复连接会发出两个信号。您可以通过 disconnect() 调用断开所有这些连接。如果连接类型是 Qt::UniqueConnection,则只有在连接不重复时才会建立连接。如果已经存在重复的信号(在相同对象上完全相同的插槽中发出完全相同的信号),则连接将失败,连接将返回无效的QMetaObject::Connection。 Qt::UniqueConnection不适用于 lambda、非成员函数和仿函数 ,它们仅适用于连接到成员函数。 可选参数描述要建立的连接类型。特别是,它确定特定信号是立即传送到插槽还是排队等待稍后传送。如果信号是排队的,参数必须是Qt的元对象系统已知的类型,因为Qt需要复制参数以将它们存储在幕后的事件中。如果您尝试使用排队连接会收到错误消息。 在建立连接之前,调用qRegisterMetaType() 注册数据类型。 See also disconnect(), sender(), qRegisterMetaType(), Q_DECLARE_METATYPE(), and Differences between String-Based and Functor-Based Connections. | |
QMetaObject::Connection | connect(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::Connection | connect(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.断开连接到特定对象的所有连接: 2.断开连接到特定信号的所有连接: 3.断开特定接收对象的连接:
注意: 断开所有信号槽连接也将断开 QObject::destroyed() s信号(如果已连接)。这样做可能会对依赖此信号清理资源的类产生负面影响。建议仅断开通过应用程序代码连接的特定信号。 | |
bool | disconnect(const QObject *sender, const QMetaMethod &signal, const QObject *receiver, const QMetaMethod &method) |
参考上一条。此外:如果出现以下情况,此函数将返回 false,并且没有信号和插槽断开连接:
| |
bool | disconnect(const QMetaObject::Connection &connection) |
bool | disconnect(const QObject *sender, PointerToMemberFunction signal, const QObject *receiver, PointerToMemberFunction method) |
const QMetaObject | staticMetaObject |
当信号signal 与对象断开连接时,将调用此虚函数。
| |
QString | tr(const char *sourceText, const char *disambiguation = nullptr, int n = -1) |
返回用于翻译版本的源文本sourceText。 如果在同一上下文中的不同角色中使用了相同的字符串,则可以传入额外的标识字符串(默认情况下)。 |
保护函数
virtual void | childEvent(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 void | connectNotify(const QMetaMethod &signal) |
当此对象已连接到 signal 时,将调用此虚拟函数。 如果要与特定信号进行比较,可以使用 QMetaMethod::fromSignal() ,如下所示: 警告: 此功能违反了面向对象的模块化原则。 | |
virtual void | customEvent(QEvent *event) |
可以在子类中重新实现此事件处理程序以接收自定义事件。自定义事件是用户定义的事件,其类型值至少与QEvent::User 类型枚举中的QEvent::Type 用户项一样大,它通常是一个QEvent子类。该事件在参数 event 中传递。 | |
virtual void | disconnectNotify(const QMetaMethod &signal) |
bool | isSignalConnected(const QMetaMethod &signal) const |
int | receivers(const char *signal) const |
QObject * | sender() const |
int | senderSignalIndex() const |
virtual void | timerEvent(QTimerEvent *event) |
它是QObject类中唯一的事件处理器函数,可以在子类中重新实现,以接收对象的计时器事件。 |
相关非成员
QObjectList | |
T | qobject_cast(QObject *object) |
T | qobject_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) | 给类设置额外信息。信息是两个字串,一个作为名字,一个作为值。 |
Q_EMIT | Q_EMIT的效果和emit一样。一些第三方库如boost会使用emit作为关键字。如果使用了这些第三方库则使用此宏代替emit。Q_SIGNAL、Q_SLOT、Q_SIGNALS、Q_SLOTS类似。 注:使用之前在pro文件中添加: |
Q_ENUM(...) | 向元对象系统注册枚举,必须放在 Q_OBJECT 和 Q_GADGET 的声明后面。 注册过后的枚举可以用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 | 将此宏应用于成员函数的声明,以允许通过元对象系统调用它们。宏写在返回类型之前。 |
Q_MOC_INCLUDE | |
Q_NAMESPACE | |
Q_NAMESPACE_EXPORT(EXPORT_MACRO) | |
Q_OBJECT | 此宏必须出现在类定义的private部分,使用此宏可以声明自己的信号和槽、使用Qt的元对象系统。这个宏要求类是QObject的子类。 |
Q_PROPERTY(...) | 此宏用于在继承QObject的类中声明属性。 属性名和类型以及READ函数是必需的。类型可以是QVariant支持的任何类型,也可以是用户定义的类型。其他项是可选的,但WRITE函数是常见的。属性默认为true,但USER默认为false。例: |
Q_REVISION | 设置槽函数和属性在元对象系统中的修订版本。 |
Q_SET_OBJECT_NAME(Object) | 把一个对象变量名(指针变量也可以)设为对象的objectName。(QObject及其子类才有用) |
Q_SIGNAL | 避免与第三方库命名冲突。 |
Q_SIGNALS | 避免与第三方库命名冲突。 |
Q_SLOT | 避免与第三方库命名冲突。 |
Q_SLOTS | 避免与第三方库命名冲突。 |