IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

QWeakPointer Class

The QWeakPointer class holds a weak reference to a shared pointer.

All functions in this class are reentrant.

Article lu   fois.

L'auteur

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

QWeakPointer Class

  • Header: QWeakPointer

  • CMake:

    find_package(Qt6 REQUIRED COMPONENTS Core)

    target_link_libraries(mytarget PRIVATE Qt6::Core)

  • qmake: QT += core

Detailed Description

The QWeakPointer is an automatic weak reference to a pointer in C++. It cannot be used to dereference the pointer directly, but it can be used to verify if the pointer has been deleted or not in another context.

QWeakPointer objects can only be created by assignment from a QSharedPointer.

It's important to note that QWeakPointer provides no automatic casting operators to prevent mistakes from happening. Even though QWeakPointer tracks a pointer, it should not be considered a pointer itself, since it doesn't guarantee that the pointed object remains valid.

Therefore, to access the pointer that QWeakPointer is tracking, you must first promote it to QSharedPointer and verify if the resulting object is null or not. QSharedPointer guarantees that the object isn't deleted, so if you obtain a non-null object, you may use the pointer. See QWeakPointer::toStrongRef() for an example.

See Also

Member Function Documentation

 

QWeakPointer::QWeakPointer()

Creates a QWeakPointer that points to nothing.

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

Creates a QWeakPointer that holds a weak reference to the pointer referenced by other.

If T is a derived type of the template parameter of this class, QWeakPointer will perform an automatic cast. Otherwise, you will get a compiler error.

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

Creates a QWeakPointer that holds a weak reference to the pointer referenced by other.

If T is a derived type of the template parameter of this class, QWeakPointer will perform an automatic cast. Otherwise, you will get a compiler error.

QWeakPointer::~QWeakPointer()

Destroys this QWeakPointer object. The pointer referenced by this object will not be deleted.

void QWeakPointer::clear()

Clears this QWeakPointer object, dropping the reference that it may have had to the pointer.

bool QWeakPointer::isNull() const

Returns true if this object refers to nullptr.

Note that, due to the nature of weak references, the pointer that QWeakPointer references can become nullptr at any moment, so the value returned from this function can change from false to true from one call to the next.

[since 5.4] QSharedPointer<T> QWeakPointer::lock() const

Same as toStrongRef().

This function is provided for API compatibility with std::weak_ptr.

This function was introduced in Qt 5.4.

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

Swaps this weak pointer instance with other. This function is very fast and never fails.

This function was introduced in Qt 5.4.

QSharedPointer<T> QWeakPointer::toStrongRef() const

Promotes this weak reference to a strong one and returns a QSharedPointer object holding that reference. When promoting to QSharedPointer, this function verifies if the object has been deleted already or not. If it hasn't, this function increases the reference count to the shared object, thus ensuring that it will not get deleted.

Since this function can fail to obtain a valid strong reference to the shared object, you should always verify if the conversion succeeded, by calling QSharedPointer::isNull() on the returned object.

For example, the following code promotes a QWeakPointer that was held to a strong reference and, if it succeeded, it prints the value of the integer that was held:

 
Sélectionnez
    QWeakPointer&lt;int&gt; weakref;

    // ...

    QSharedPointer&lt;int&gt; strong = weakref.toStrongRef();
    if (strong)
        qDebug() &lt;&lt; "The value is:" &lt;&lt; *strong;
    else
        qDebug() &lt;&lt; "The value has already been deleted";
See Also

bool QWeakPointer::operator bool() const

Returns true if the contained pointer is not nullptr. This function is suitable for use in if-constructs, like:

 
Sélectionnez
    if (weakref) { ... }

Note that, due to the nature of weak references, the pointer that QWeakPointer references can become nullptr at any moment, so the value returned from this function can change from true to false from one call to the next.

See Also

See also isNull()

bool QWeakPointer::operator!() const

Returns true if this object refers to nullptr. This function is suitable for use in if-constructs, like:

 
Sélectionnez
    if (!weakref) { ... }

Note that, due to the nature of weak references, the pointer that QWeakPointer references can become nullptr at any moment, so the value returned from this function can change from false to true from one call to the next.

See Also

See also isNull()

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

Makes this object share other's pointer. The current pointer reference is discarded but is not deleted.

If T is a derived type of the template parameter of this class, QWeakPointer will perform an automatic cast. Otherwise, you will get a compiler error.

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

Makes this object share other's pointer. The current pointer reference is discarded but is not deleted.

If T is a derived type of the template parameter of this class, QWeakPointer will perform an automatic cast. Otherwise, you will get a compiler error.

Related Non-Members

 

QWeakPointer<X> qWeakPointerCast(const QWeakPointer<T> &src)

Returns a weak pointer to the pointer held by src, cast to type X. The types T and X must belong to one hierarchy for the static_cast to succeed.

Note that X must have the same cv-qualifiers (const and volatile) that T has, or the code will fail to compile. Use qSharedPointerConstCast to cast away the constness.

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

Returns true if ptr1 and ptr2 refer to distinct pointers.

If ptr2's template parameter is different from ptr1's, QSharedPointer will attempt to perform an automatic static_cast to ensure that the pointers being compared are equal. If ptr2's template parameter is not a base or a derived type from ptr1's, you will get a compiler error.

[since 5.8] bool operator!=(const QWeakPointer<T> &lhs, std::nullptr_t)

Returns true if lhs refers to a valid (i.e. non-null) pointer.

This function was introduced in Qt 5.8.

See Also

[since 5.8] bool operator!=(std::nullptr_t, const QWeakPointer<T> &rhs)

Returns true if rhs refers to a valid (i.e. non-null) pointer.

This function was introduced in Qt 5.8.

See Also

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

Returns true if ptr1 and ptr2 refer to distinct pointers.

If ptr2's template parameter is different from ptr1's, QSharedPointer will attempt to perform an automatic static_cast to ensure that the pointers being compared are equal. If ptr2's template parameter is not a base or a derived type from ptr1's, you will get a compiler error.

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

Returns true if ptr1 and ptr2 refer to the same pointer.

If ptr2's template parameter is different from ptr1's, QSharedPointer will attempt to perform an automatic static_cast to ensure that the pointers being compared are equal. If ptr2's template parameter is not a base or a derived type from ptr1's, you will get a compiler error.

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

Returns true if ptr1 and ptr2 refer to the same pointer.

If ptr2's template parameter is different from ptr1's, QSharedPointer will attempt to perform an automatic static_cast to ensure that the pointers being compared are equal. If ptr2's template parameter is not a base or a derived type from ptr1's, you will get a compiler error.

[since 5.8] bool operator==(const QWeakPointer<T> &lhs, std::nullptr_t)

Returns true if lhs refers to nullptr.

This function was introduced in Qt 5.8.

See Also

[since 5.8] bool operator==(std::nullptr_t, const QWeakPointer<T> &rhs)

Returns true if rhs refers to nullptr.

This function was introduced in Qt 5.8.

See Also

Obsolete Members for QWeakPointer

The following members of class QWeakPointer are deprecated. We strongly advise against using them in new code.

Obsolete Member Function Documentation

 
QWeakPointer::QWeakPointer(const QObject *other)

This function is deprecated. We strongly advise against using it in new code.

Creates a QWeakPointer that holds a weak reference directly to the QObject other. This constructor is only available if the template type T is QObject or derives from it (otherwise a compilation error will result).

You can use this constructor with any QObject, even if they were not created with QSharedPointer.

Note that QWeakPointers created this way on arbitrary QObjects usually cannot be promoted to QSharedPointer.

See Also
T *QWeakPointer::data() const

This function is deprecated. We strongly advise against using it in new code.

Use toStrongRef() instead, and data() on the returned QSharedPointer.

Returns the value of the pointer being tracked by this QWeakPointer, without ensuring that it cannot get deleted. To have that guarantee, use toStrongRef(), which returns a QSharedPointer object. If this function can determine that the pointer has already been deleted, it returns nullptr.

It is ok to obtain the value of the pointer and using that value itself, like for example in debugging statements:

 
Sélectionnez
    qDebug("Tracking %p", weakref.data());

However, dereferencing the pointer is only allowed if you can guarantee by external means that the pointer does not get deleted. For example, if you can be certain that no other thread can delete it, nor the functions that you may call.

If that is the case, then the following code is valid:

 
Sélectionnez
    // this pointer cannot be used in another thread
    // so other threads cannot delete it
    QWeakPointer&lt;int&gt; weakref = obtainReference();

    Object *obj = weakref.data();
    if (obj) {
        // if the pointer wasn't deleted yet, we know it can't get
        // deleted by our own code here nor the functions we call
        otherFunction(obj);
    }

Use this function with care.

See Also

See also isNull(), toStrongRef()

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

This function is deprecated. We strongly advise against using it in new code.

Makes this QWeakPointer hold a weak reference directly to the QObject other. This function is only available if the template type T is QObject or derives from it.

See Also

See also QPointer

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+