QPointer 类

模板 <typename T> 类 QPointer

QPointer 类是提供守卫指针的模板类,指向 QObject . 更多...

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

公共函数

QPointer ()
QPointer (std::nullptr_t)
QPointer (T * p )
(从 6.6 起) QPointer (QPointer<X> && other )
(从 6.6 起) QPointer (const QPointer<X> & other )
~QPointer ()
void clear ()
T * data () const
(从 6.0 起) T * get () const
bool isNull () const
void swap (QPointer<T> & other )
T * operator T * () const
T & operator* () const
T * operator-> () const
(从 6.6 起) QPointer<T> & operator= (const QPointer<X> & other )
(since 6.6.1) QPointer<T> & operator= (QPointer<X> && other )
QPointer<T> & operator= (T * p )
bool operator!= (const QPointer<T> & p1 , const QPointer<X> & p2 )
bool operator!= (const QPointer<T> & p , X * o )
bool operator!= (X * o , const QPointer<T> & p )
bool operator!= (const QPointer<T> & lhs , std::nullptr_t)
bool operator!= (std::nullptr_t, const QPointer<T> & rhs )
bool operator== (const QPointer<T> & p1 , const QPointer<X> & p2 )
bool operator== (const QPointer<T> & p , X * o )
bool operator== (X * o , const QPointer<T> & p )
bool operator== (const QPointer<T> & lhs , std::nullptr_t)
bool operator== (std::nullptr_t, const QPointer<T> & rhs )

详细描述

守卫指针 QPointer<T>,行为像正常 C++ 指针 T * ,除了它会被自动清零,当销毁引用对象时 (不像正常 C++ 指针,在这种情况下,会变成 "悬空指针")。 T 必须是子类化的 QObject .

守卫指针很有用,每当需要存储的指针指向 QObject 由他人拥有,因此仍然可能在保持其引用时被销毁。可以安全地测试,指针的有效性。

注意,Qt 5 引入了轻微的行为变化,当使用 QPointer 时。

  • 当使用 QPointer 在 QWidget (或子类化的 QWidget ),先前,QPointer 的清零是通过 QWidget 析构函数。现在,QPointer 的清零是通过 QObject 析构函数 (由于这是在 QWeakPointer 对象被清零时)。追踪 Widget 的任何 QPointer 都会 NOT 被清零先于 QWidget 析构函数销毁用于追踪 Widget 的子级。

Qt 还提供 QSharedPointer ,计数引用共享指针对象的实现,可以用于维护单个指针的引用集合。

范例:

    QPointer<QLabel> label = new QLabel;
    label->setText("&Status:");
    ...
    if (label)
        label->show();
					

QLabel 被同时删除, label 变量将保持 nullptr 而不是无效地址,且从不会执行最后一行。

The functions and operators available with a QPointer are the same as those available with a normal unguarded pointer, except the pointer arithmetic operators ( + , - , ++ ,和 -- ), which are normally used only with arrays of objects.

使用 QPointer 像正常指针,且不需要阅读此类文档编制。

For creating guarded pointers, you can construct or assign to them from a T* or from another guarded pointer of the same type. You can compare them with each other using operator==() and operator!=(), or test for nullptr with isNull (). You can dereference them using either the *x x->member 表示法。

守卫指针将自动铸造成 T *, so you can freely mix guarded and unguarded pointers. This means that if you have a QPointer< QWidget >, you can pass it to a function that requires a QWidget *. For this reason, it is of little value to declare functions to take a QPointer as a parameter; just use normal pointers. Use a QPointer when you are storing a pointer over time.

注意,类 T 必须继承 QObject ,否则会导致编译 (或链接) 错误。

另请参阅 QSharedPointer , QObject ,和 QObjectCleanupHandler .

成员函数文档编制

[noexcept] QPointer:: QPointer ()

[constexpr noexcept] QPointer:: QPointer ( std::nullptr_t )

构造守卫指针采用值 nullptr .

另请参阅 isNull ().

[noexcept, since 6.6] template <typename X, QPointer<T>::if_convertible = true> QPointer:: QPointer ( QPointer < X > && other )

[noexcept, since 6.6] template <typename X, QPointer<T>::if_convertible = true> QPointer:: QPointer (const QPointer < X > & other )

Conversion constructor. Constructs a new QPointer by moving or copying from other .

The moved-from QPointer is reset to nullptr.

注意: These constructors participate in overload resolution only if X* is convertible to T* .

该函数在 Qt 6.6 引入。

QPointer:: QPointer ( T * p )

构造守卫指针指向同一对象 p 所指向。

QPointer:: ~QPointer ()

销毁守卫指针。就像正常指针,销毁守卫指针 not 销毁所指向的对象。

[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 if the referenced object has been destroyed or if there is no referenced object; otherwise returns false .

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

交换内容对于此 QPointer 采用内容源于 other 。此操作非常快且从不失败。

[noexcept] T *QPointer:: operator T * () const

Cast operator; implements pointer semantics. Because of this function you can pass a QPointer <T> to a function where a T* is required.

[noexcept] T &QPointer:: operator* () const

Dereference operator; implements pointer semantics. Just use this operator as you would with a normal C++ pointer.

[noexcept] T *QPointer:: operator-> () const

Overloaded arrow operator; implements pointer semantics. Just use this operator as you would with a normal C++ pointer.

[noexcept, since 6.6] template <typename X, QPointer<T>::if_convertible = true> QPointer < T > &QPointer:: operator= (const QPointer < X > & other )

Conversion assignment operator. Makes this guarded pointer guard the same object guarded by other .

注意: This operator participates in overload resolution only if X* is convertible to T* .

该函数在 Qt 6.6 引入。

[noexcept, since 6.6.1] template <typename X, QPointer<T>::if_convertible = true> QPointer < T > &QPointer:: operator= ( QPointer < X > && other )

Conversion move-assignment operator. Makes this guarded pointer guard the same object guarded by other and resets other to nullptr.

注意: This operator participates in overload resolution only if X* is convertible to T* .

This function was introduced in Qt 6.6.1.

QPointer < T > &QPointer:: operator= ( T * p )

赋值运算符。此守卫指针现在将指向同一对象 p 所指向。

相关非成员

[noexcept] template <typename X> bool operator!= (const QPointer < T > & p1 , const QPointer < X > & p2 )

不相等操作符。返回 true 若守卫指针 p1 and p2 未指向同一对象,否则返回 false .

[noexcept] template <typename X> bool operator!= (const QPointer < T > & p , X * o )

不相等操作符。返回 true if o 和守卫指针 p 未指向同一对象,否则返回 false .

[noexcept] template <typename X> bool operator!= ( X * o , const QPointer < T > & p )

不相等操作符。返回 true if o 和守卫指针 p 未指向同一对象,否则返回 false .

[noexcept] bool operator!= (const QPointer < T > & lhs , std::nullptr_t )

不相等操作符。返回 true if the pointer guarded by lhs is a valid (ie not nullptr ) pointer, otherwise returns false .

[noexcept] bool operator!= ( std::nullptr_t , const QPointer < T > & rhs )

不相等操作符。返回 true if the pointer guarded by rhs is a valid (ie not nullptr ) pointer, otherwise returns false .

[noexcept] template <typename X> bool operator== (const QPointer < T > & p1 , const QPointer < X > & p2 )

相等运算符。返回 true 若守卫指针 p1 and p2 指向同一对象,否则返回 false .

[noexcept] template <typename X> bool operator== (const QPointer < T > & p , X * o )

相等运算符。返回 true if o 和守卫指针 p 指向同一对象,否则返回 false .

[noexcept] template <typename X> bool operator== ( X * o , const QPointer < T > & p )

相等运算符。返回 true if o 和守卫指针 p 指向同一对象,否则返回 false .

[noexcept] bool operator== (const QPointer < T > & lhs , std::nullptr_t )

相等运算符。返回 true if the pointer guarded by lhs is nullptr ,否则返回 false .

[noexcept] bool operator== ( std::nullptr_t , const QPointer < T > & rhs )

相等运算符。返回 true if the pointer guarded by rhs is nullptr ,否则返回 false .