本页内容

QWeakPointer Class

template <typename T> class QWeakPointer

QWeakPointer 类持有对共享指针的一个弱引用。更多内容...

头文件: #include <QWeakPointer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

注意:该类中的所有函数均为可重入函数。

公共函数

QWeakPointer()
QWeakPointer(const QSharedPointer<T> &other)
QWeakPointer(const QWeakPointer<T> &other)
~QWeakPointer()
void clear()
bool isNull() const
QSharedPointer<T> lock() const
(since 6.7) bool owner_before(const QSharedPointer<X> &other) const
(since 6.7) bool owner_before(const QWeakPointer<X> &other) const
(since 6.7) bool owner_equal(const QSharedPointer<X> &other) const
(since 6.7) bool owner_equal(const QWeakPointer<X> &other) const
(since 6.7) size_t owner_hash() const
void swap(QWeakPointer<T> &other)
QSharedPointer<T> toStrongRef() const
operator bool() const
bool operator!() const
QWeakPointer<T> &operator=(const QSharedPointer<T> &other)
QWeakPointer<T> &operator=(const QWeakPointer<T> &other)
QWeakPointer<X> qWeakPointerCast(const QWeakPointer<T> &src)
bool operator!=(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2)
bool operator!=(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
bool operator!=(const QWeakPointer<T> &lhs, std::nullptr_t)
bool operator!=(std::nullptr_t, const QWeakPointer<T> &rhs)
bool operator==(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2)
bool operator==(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2)
bool operator==(const QWeakPointer<T> &lhs, std::nullptr_t)
bool operator==(std::nullptr_t, const QWeakPointer<T> &rhs)

详细描述

QWeakPointer 是 C++ 中对指针的自动弱引用,其中模板参数T 指定了要跟踪的指针的类型。它不能用于直接解引用该指针,但可用于验证该指针在其他上下文中是否已被删除。

QWeakPointer 对象只能通过从QSharedPointer 进行赋值来创建。

需要注意的是,QWeakPointer 不提供任何自动转换运算符,以防止发生错误。尽管 QWeakPointer 跟踪了一个指针,但它本身不应被视为指针,因为它不能保证所指向的对象仍然有效。

因此,要访问 QWeakPointer 所跟踪的指针,必须先将其提升为 `QSharedPointer `,并验证所得对象是否为空。`QSharedPointer ` 保证该对象未被删除,因此若获得非空对象,即可使用该指针。示例请参见QWeakPointer::toStrongRef()。

另请参阅 QSharedPointer 和QScopedPointer 。

成员函数文档

QWeakPointer::QWeakPointer()

创建一个指向空值的 QWeakPointer。

QWeakPointer::QWeakPointer(const QSharedPointer<T> &other)

创建一个 QWeakPointer,该对象持有对other 所引指针的弱引用。

如果T 是本类模板参数的派生类型,QWeakPointer 将执行自动类型转换。否则,将会引发编译器错误。

[noexcept] QWeakPointer::QWeakPointer(const QWeakPointer<T> &other)

创建一个 QWeakPointer,它持有对由other 所引用的指针的弱引用。

如果T 是本类模板参数的派生类型,QWeakPointer 将执行自动转换。否则,将会引发编译器错误。

QWeakPointer::~QWeakPointer()

销毁此QWeakPointer 对象。该对象引用的指针不会被删除。

void QWeakPointer::clear()

清除此QWeakPointer 对象,并释放其可能持有的指向该指针的引用。

bool QWeakPointer::isNull() const

如果该对象指向nullptr ,则返回true 。

请注意,由于弱引用的特性,QWeakPointer 所引用的指针可能随时变为nullptr ,因此该函数返回的值可能在两次调用之间从 false 变为 true。

QSharedPointer<T> QWeakPointer::lock() const

与toStrongRef()相同。

提供此函数是为了与 std::weak_ptr 保持 API 兼容性。

[noexcept, since 6.7] template <typename X> bool QWeakPointer::owner_before(const QSharedPointer<X> &other) const

[noexcept, since 6.7] template <typename X> bool QWeakPointer::owner_before(const QWeakPointer<X> &other) const

仅当该智能指针在实现定义的所有者基于排序中位于other 之前时,才返回true 。该排序规则规定:如果两个智能指针均为空,或者它们都拥有同一个对象(即使它们的表观类型和指针不同),则视为等价。

这些函数在 Qt 6.7 中引入。

另请参阅 owner_equal 。

[noexcept, since 6.7] template <typename X> bool QWeakPointer::owner_equal(const QSharedPointer<X> &other) const

[noexcept, since 6.7] template <typename X> bool QWeakPointer::owner_equal(const QWeakPointer<X> &other) const

当且仅当此智能指针与other 共享所有权时,返回true 。

这些函数在 Qt 6.7 中引入。

另请参阅 owner_before 和owner_hash 。

[noexcept, since 6.7] size_t QWeakPointer::owner_hash() const

返回此智能指针对象的基于所有者的哈希值。根据owner_equal 的规定,相等的智能指针将具有相同的基于所有者的哈希值。

这些函数在 Qt 6.7 中引入。

另请参阅 owner_equal 。

[noexcept] void QWeakPointer::swap(QWeakPointer<T> &other)

将此弱指针实例与other 互换。此操作速度极快,且绝不会失败。

QSharedPointer<T> QWeakPointer::toStrongRef() const

将此弱引用提升为强引用,并返回一个包含该引用的QSharedPointer 对象。在提升为QSharedPointer 时,该函数会验证该对象是否已被删除。如果尚未被删除,该函数会增加对该共享对象的引用计数,从而确保它不会被删除。

由于该函数可能无法获得对共享对象的有效强引用,因此应始终通过在返回的对象上调用QSharedPointer::isNull() 来验证转换是否成功。

例如,以下代码将一个持有的 `QWeakPointer ` 提升为强引用,如果成功,则打印所持有整数的值:

QWeakPointer<int>weakref;

// ...

QSharedPointer<int>strong=weakref.toStrongRef();
if(strong)
    qDebug() << "The value is:" << *strong;
else
    qDebug() << "The value has already been deleted";

另请参阅 QSharedPointer::QSharedPointer()。

QWeakPointer::operator bool() const

如果所包含的指针不是nullptr ,则返回true 。该函数适用于在if-constructs 中使用,例如:

if (weakref) { /*...*/ }

请注意,由于弱引用的特性,QWeakPointer 所引用的指针随时可能变为nullptr ,因此该函数返回的值可能在两次调用之间从 true 变为 false。

另请参阅 isNull()。

bool QWeakPointer::operator!() const

如果该对象指向nullptr ,则返回true 。该函数适用于if-constructs ,例如:

if (!weakref) { /*...*/ }

请注意,由于弱引用的特性,QWeakPointer 所引用的指针随时可能变为nullptr ,因此该函数返回的值可能在两次调用之间从 false 变为 true。

另请参阅 isNull()。

QWeakPointer<T> &QWeakPointer::operator=(const QSharedPointer<T> &other)

使该对象共享other 的指针。当前的指针引用将被丢弃,但不会被删除。

如果T 是本类模板参数的派生类型,则QWeakPointer 将执行自动类型转换。否则,将会引发编译器错误。

[noexcept] QWeakPointer<T> &QWeakPointer::operator=(const QWeakPointer<T> &other)

使该对象共享other 的指针。当前的指针引用将被丢弃,但不会被删除。

如果T 是本类模板参数的派生类型,则QWeakPointer 将执行自动转换。否则,将引发编译器错误。

相关的非成员

template <typename X, typename T> QWeakPointer<X> qWeakPointerCast(const QWeakPointer<T> &src)

返回一个指向src 所保存的指针的弱指针,该指针已被强制转换为类型X 。类型T 和X 必须属于同一个类型层次结构,static_cast 才能成功。

请注意,X 必须与T 具有相同的 cv 限定符(const 和volatile ),否则代码将无法编译。使用qSharedPointerConstCast 进行强制转换以去除 const 修饰。

template <typename T, typename X> bool operator!=(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2)

如果ptr1 和ptr2 指向不同的指针,则返回true 。

如果 `ptr2` 的模板参数与 `ptr1` 的不同,`QSharedPointer ` 将尝试执行自动的 `static_cast `,以确保被比较的指针是相等的。如果 `ptr2` 的模板参数不是 `ptr1` 的基类或派生类,则会引发编译器错误。

template <typename T, typename X> bool operator!=(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2)

如果ptr1 和ptr2 指向不同的指针,则返回true 。

如果 `ptr2` 的模板参数与 `ptr1` 的不同,`QSharedPointer ` 将尝试执行自动static_cast ,以确保被比较的指针是相等的。如果 `ptr2` 的模板参数不是 `ptr1` 的基类或派生类型,则会引发编译器错误。

template <typename T> bool operator!=(const QWeakPointer<T> &lhs, std::nullptr_t)

如果 `lhs ` 指向一个有效的(即非空)指针,则返回 `true `。

另请参阅 QWeakPointer::isNull()。

template <typename T> bool operator!=(std::nullptr_t, const QWeakPointer<T> &rhs)

如果 `rhs ` 指向一个有效的(即非空的)指针,则返回 `true `。

另请参阅 QWeakPointer::isNull()。

template <typename T, typename X> bool operator==(const QSharedPointer<T> &ptr1, const QWeakPointer<X> &ptr2)

如果ptr1 和ptr2 指向同一个指针,则返回true 。

如果ptr2 的模板参数与ptr1 的不同,QSharedPointer 将尝试执行自动static_cast ,以确保被比较的指针相等。如果ptr2 的模板参数既不是ptr1 的基类,也不是其派生类,则会引发编译器错误。

template <typename T, typename X> bool operator==(const QWeakPointer<T> &ptr1, const QSharedPointer<X> &ptr2)

如果ptr1 和ptr2 指向同一个指针,则返回true 。

如果ptr2 的模板参数与ptr1 的不同,QSharedPointer 将尝试执行自动static_cast ,以确保被比较的指针相等。如果ptr2 的模板参数既不是ptr1 的基类,也不是其派生类,则会引发编译器错误。

template <typename T> bool operator==(const QWeakPointer<T> &lhs, std::nullptr_t)

如果lhs 指向nullptr ,则返回true 。

另请参阅 QWeakPointer::isNull()。

template <typename T> bool operator==(std::nullptr_t, const QWeakPointer<T> &rhs)

如果rhs 指向nullptr ,则返回true 。

另请参阅 QWeakPointer::isNull()。

© 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.