QPointer Class
template <typename T> class QPointerQPointer 类是一个模板类,它提供指向 `QObject` 的受保护指针。更多内容...
| 头文件: | #include <QPointer> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
QPointer 比较
| 类别 | 可比较类型 | 描述 |
|---|---|---|
| 相等性 | QPointer | |
| 相等性 | QPointer<X>、X* 和 std::nullptr_t。 | 其中 X 和 T 是兼容类型,这意味着它们要么相同(除了 cv 限定符之外),要么一个是另一个的基类。 |
公共函数
| QPointer() | |
(since 6.6) | QPointer(QPointer<X> &&other) |
| QPointer(T *p) | |
(since 6.6) | QPointer(const QPointer<X> &other) |
| QPointer(std::nullptr_t) | |
| ~QPointer() | |
| void | clear() |
| T * | data() const |
(since 6.0) T * | get() const |
| bool | isNull() const |
| void | swap(QPointer<T> &other) |
| operator T *() const | |
| T & | operator*() const |
| T * | operator->() const |
(since 6.6.1) QPointer<T> & | operator=(QPointer<X> &&other) |
| QPointer<T> & | operator=(T *p) |
(since 6.6) QPointer<T> & | operator=(const QPointer<X> &other) |
相关的非成员
| bool | operator!=(X *const &lhs, const QPointer<T> &rhs) |
| bool | operator!=(const QPointer<T> &lhs, X *const &rhs) |
| bool | operator!=(const QPointer<T> &lhs, const QPointer<X> &rhs) |
| bool | operator!=(const QPointer<T> &lhs, const std::nullptr_t &rhs) |
| bool | operator!=(const std::nullptr_t &lhs, const QPointer<T> &rhs) |
| bool | operator==(X *const &lhs, const QPointer<T> &rhs) |
| bool | operator==(const QPointer<T> &lhs, X *const &rhs) |
| bool | operator==(const QPointer<T> &lhs, const QPointer<X> &rhs) |
| bool | operator==(const QPointer<T> &lhs, const std::nullptr_t &rhs) |
| bool | operator==(const std::nullptr_t &lhs, const QPointer<T> &rhs) |
详细说明
带保护的指针 QPointer<T> 的行为与普通 C++ 指针T * 类似,不同之处在于,当被引用的对象被销毁时,它会自动被清空(而普通的 C++ 指针在这种情况下会变成“悬空指针”)。 模板参数T 指定了被引用的QObject 派生类型;T 必须是QObject 的子类。
当您需要存储指向由他人拥有的QObject 的指针时(该指针可能在您仍持有其引用期间被销毁),受保护指针便派上用场。您可以安全地检查该指针是否有效。
请注意,Qt 5 在使用 QPointer 时引入了行为上的细微变化。
- 当在QWidget (或QWidget 的子类)上使用QPointer时,此前QPointer会由QWidget 的析构函数清除。现在,QPointer由QObject 的析构函数清除(因为此时QWeakPointer 对象会被清除)。 任何跟踪小部件的 QPointer都不会在 QWidget 的析构函数销毁所跟踪小部件的子项之前被清空。
Qt XML 还提供了QSharedPointer ,这是一个带引用计数的共享指针对象的实现,可用于维护指向单个指针的引用集合。
示例:
如果在此期间删除了该QLabel ,则label 变量将保存nullptr 而非无效地址,且最后一行代码将永远不会被执行。
QPointer 可用的函数和运算符与普通未受保护的指针相同,但指针算术运算符(+ 、- 、++ 和-- )除外,这些运算符通常仅用于对象数组。
像使用普通指针一样使用 QPointers,您就不需要阅读本类的文档了。
要创建受保护指针,你可以通过 T* 或同类型的另一个受保护指针来构造或赋值。你可以使用 operator==() 和 operator!=( ) 进行相互比较,或使用isNull() 检查是否为nullptr 。你可以使用*x 或x->member 语法进行解引用。
受保护指针会自动转换为T *,因此你可以自由地混合使用受保护和不受保护的指针。 这意味着,如果您有一个 QPointer<QWidget>,可以将其传递给需要QWidget * 的函数。因此,声明将 QPointer 作为参数的函数意义不大;只需使用普通指针即可。当您需要长期存储指针时,请使用 QPointer。
请注意,类T 必须继承自QObject ,否则会导致编译或链接错误。
另请参阅 QSharedPointer 、QObject 和QObjectCleanupHandler 。
成员函数文档
[noexcept default] QPointer::QPointer()
[constexpr noexcept] QPointer::QPointer(std::nullptr_t)
构建一个值为nullptr 的受保护指针。
另请参阅 isNull()。
[noexcept, since 6.6] template <typename X> requires if_convertible<X> QPointer::QPointer(QPointer<X> &&other)
[noexcept, since 6.6] template <typename X> requires if_convertible<X> QPointer::QPointer(const QPointer<X> &other)
转换构造函数。通过从other 移动或复制数据,构造一个新的QPointer 。
被移动源的QPointer 将被重置为 nullptr。
注意: 只有当X* 可转换为T* 时,这些 构造函数才会参与重载解析。
这些函数在 Qt 6.6 中引入。
QPointer::QPointer(T *p)
构建一个受保护的指针,该指针指向与p 所指向的同一对象。
QPointer::~QPointer()
销毁受保护的指针。与普通指针一样,销毁受保护的指针不会销毁其所指向的对象。
[noexcept] void QPointer::clear()
清除此QPointer 对象。
另请参阅 isNull()。
[noexcept] T *QPointer::data() const
返回被保护对象的指针。
[noexcept, since 6.0] T *QPointer::get() const
与data() 相同。提供此函数是为了与 STL 兼容。
该函数在 Qt 6.0 中引入。
[noexcept] bool QPointer::isNull() const
如果引用的对象已被销毁,或者不存在被引用的对象,则返回true ;否则返回false 。
[noexcept] void QPointer::swap(QPointer<T> &other)
将该指针与other 互换。此操作速度极快,且绝不会失败。
[noexcept] QPointer::operator T *() const
类型转换运算符;实现指针语义。借助此函数,您可以将QPointer<T>传递给要求 T* 的函数。
[noexcept] T &QPointer::operator*() const
解引用运算符;实现了指针语义。使用该运算符时,只需像使用普通 C++ 指针一样操作即可。
[noexcept] T *QPointer::operator->() const
重载的箭头运算符;实现了指针语义。使用该运算符时,只需像使用普通 C++ 指针那样操作即可。
[noexcept, since 6.6.1] template <typename X> requires if_convertible<X> QPointer<T> &QPointer::operator=(QPointer<X> &&other)
转换移动赋值运算符。使该受保护指针所保护的对象与other 所保护的对象相同,并将other 重置为nullptr。
约束
仅当X* 可转换为T* 时,才参与重载解析。
该函数于 Qt 6.6.1 中引入。
QPointer<T> &QPointer::operator=(T *p)
赋值运算符。现在,这个受保护的指针将指向与p 所指向的同一对象。
[noexcept, since 6.6] template <typename X> requires if_convertible<X> QPointer<T> &QPointer::operator=(const QPointer<X> &other)
转换赋值运算符。使该受保护指针所保护的对象与other 所保护的对象相同。
约束
仅当X* 可转换为T* 时,才参与重载解析。
该函数在 Qt 6.6 中引入。
相关的非成员函数
[noexcept] template <typename X> bool operator!=(X *const &lhs, const QPointer<T> &rhs)
不等号运算符。如果lhs 和受保护指针rhs 指向的对象不同,则返回true ;否则返回false 。
[noexcept] template <typename X> bool operator!=(const QPointer<T> &lhs, X *const &rhs)
不等号运算符。如果rhs 和受保护指针lhs 指向的对象不同,则返回true ;否则返回false 。
[noexcept(...)] template <typename X> bool operator!=(const QPointer<T> &lhs, const QPointer<X> &rhs)
不等号运算符。如果受保护的指针lhs 和rhs 指向不同的对象,则返回true ;否则返回false 。
注意: 当true 等于true 时,此 函数为 noexcept。
[noexcept] bool operator!=(const QPointer<T> &lhs, const std::nullptr_t &rhs)
不等号运算符。如果由lhs 保护的指针是一个有效的指针(即不是nullptr ),则返回true ;否则返回false 。
[noexcept] bool operator!=(const std::nullptr_t &lhs, const QPointer<T> &rhs)
不等号运算符。如果由rhs 保护的指针是一个有效的指针(即不是nullptr ),则返回true ;否则返回false 。
[noexcept] template <typename X> bool operator==(X *const &lhs, const QPointer<T> &rhs)
等于运算符。如果 `lhs ` 和受保护指针 `rhs ` 指向同一个对象,则返回 `true `;否则返回 `false`。
[noexcept] template <typename X> bool operator==(const QPointer<T> &lhs, X *const &rhs)
等于运算符。如果rhs 和受保护指针lhs 指向同一个对象,则返回true ;否则返回false 。
[noexcept(...)] template <typename X> bool operator==(const QPointer<T> &lhs, const QPointer<X> &rhs)
相等运算符。如果受保护的指针lhs 和rhs 指向同一个对象,则返回true ;否则返回false 。
注意: 当true 等于true 时,此 函数为 noexcept。
[noexcept] bool operator==(const QPointer<T> &lhs, const std::nullptr_t &rhs)
相等运算符。如果由 `lhs ` 保护的指针指向 `nullptr`,则返回 `true `;否则返回 `false`。
[noexcept] bool operator==(const std::nullptr_t &lhs, const QPointer<T> &rhs)
相等运算符。如果由rhs 保护的指针指向nullptr ,则返回true ;否则返回false 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.