QPointer 类

template <typename T> class QPointer

QPointer 类是一个模板类,它为 QObject 提供受控指针。 更多...

头文件 #include <QPointer>
CMakefind_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmakeQT += core

公共函数

QPointer()
QPointer(std::nullptr_t)
QPointer(T *p)
(自 6.6) QPointer(QPointer<X> &&other)
(自 6.6) QPointer(const QPointer<X> &other)
~QPointer()
voidclear()
T *data() const
(自 6.0) T *get() const
boolisNull() const
voidswap(QPointer<T> &other)
T *operator T *() const
T &operator*() const
T *operator->() const
(自 6.6) QPointer<T> &operator=(const QPointer<X> &other)
(自 6.6.1) QPointer<T> &operator=(QPointer<X> &&other)
QPointer<T> &operator=(T *p)
booloperator!=(const QPointer<T> &p1, const QPointer<X> &p2)
booloperator!=(const QPointer<T> &p, X *o)
booloperator!=(X *o, const QPointer<T> &p)
booloperator!=(const QPointer<T> &lhs, std::nullptr_t)
booloperator!=(std::nullptr_t, const QPointer<T> &rhs)
booloperator==(const QPointer<T> &p1, const QPointer<X> &p2)
booloperator==(const QPointer<T> &p, X *o)
booloperator==(X *o, const QPointer<T> &p)
booloperator==(const QPointer<T> &lhs, std::nullptr_t)
booloperator==(std::nullptr_t, const QPointer<T> &rhs)

详细描述

受保护的指针,QPointer<T>,行为类似于普通的C++指针 T *,但它在引用的对象被销毁时会自动清除(与普通C++指针不同,在这种情况下它们会变成“悬挂指针”)。T 必须是 QObject 的子类。

当您需要存储一个由其他人拥有的 QObject 的指针时,保护指针很有用,并且可能在其引用仍然存在时被销毁。您可以安全地测试指针的有效性。

请注意,Qt 5在使用QPointer时引入了一些行为上的细微变化。

  • 当在 QWidget(或 QWidget 的子类)上使用 QPointer 时,之前 QPointer 由 QWidget 析构函数清除。现在,QPointer 由 QObject 析构函数清除(因为这时会清除 QWeakPointer 对象)。任何跟踪Widgets的 QPointers不会QWidget 析构函数销毁跟踪的Widgets的子项之前被清除。

Qt 还提供了 QSharedPointer,这是一个引用计数共享指针对象的实现,可用于维护一组指向单个指针的引用。

示例

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

如果在此时删除了 QLabel,则 label 变量将保留空指针 nullptr,而不是无效地址,并且最后一行永远不会执行。

QPointer具有与普通非受保护指针相同的功能和运算符,只是指针运算符(+-++--),这些通常只用于对象的数组。

像普通指针一样使用QPointer,您就不需要阅读此类文档了。

要创建保护指针,您可以从 T* 或同一类型的另一个保护指针构造或分配给它们。您可以使用 operator==() 和 operator!=() 比较它们,或者使用 isNull() 测试 nullptr。您可以使用 *xx->member 符号来解引用它们。

保护指针将自动转换为 T *,这意味着您可以自由混合受保护和不受保护的指针。这意味着如果您有一个 QPointer<QWidget>,您可以将它传递给需要一个 QWidget * 的函数。因此,声明接受 QPointer 作为参数的函数几乎没有任何价值;只需使用普通指针即可。在存储指针时使用QPointer。

请注意,类 T 必须继承自 QObject,否则会引发编译或链接错误。

另请参阅 QSharedPointerQObjectQObjectCleanupHandler

成员函数文档

[noexcept] QPointer::QPointer()

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

创建一个值为 nullptr 的保护指针。

另请参阅 isNull

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

[noexcept, since 6.6] 模板 <typename X, QPointer<T>::if_convertible= true> 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)

交换此QPointerother的内容。此操作非常快,且从不失败。

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

类型转换运算符;实现指针语义。由于此函数,您可以将QPointer<T>传递给需要T*参数的函数。

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

解引用运算符;实现指针语义。正如您会使用普通C++指针一样使用此运算符。

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

重载的箭头运算符;实现指针语义。正如您会使用普通C++指针一样使用此运算符。

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

转换赋值运算符。使此受保护的指针保护由other所保护的同一对象。

注意:只有当X*可以被转换为T*时,此运算符才参与重载解析。

此功能自Qt 6.6引入。

[noexcept, since 6.6.1] 模板 <类型名 X, QPointer<T>::if_convertible= true> QPointer<T> &QPointer::operator=(QPointer<X> &&other)

转换移动赋值运算符。使保护指针 guard 保持与 other 守护的同一对象相同,并将 other 重置为 nullptr。

注意:只有当X*可以被转换为T*时,此运算符才参与重载解析。

此函数从 Qt 6.6.1 版本引入。

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

赋值运算符。此保护指针现在将指向与 p 相同的对象。

相关非成员函数

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

不等式运算符。如果保护指针 p1p2 不指向同一对象,则返回 true,否则返回 false

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

不等式运算符。如果 o 和保护指针 p 不指向同一对象,则返回 true,否则返回 false

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

不等式运算符。如果 o 和保护指针 p 不指向同一对象,则返回 true,否则返回 false

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

不等式运算符。如果 lhs 守护的指针是有效的(即不是 nullptr),则返回 true,否则返回 false

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

不等式运算符。如果 rhs 守护的指针是有效的(即不是 nullptr),则返回 true,否则返回 false

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

相等运算符。如果保护指针 p1p2 指向同一对象,则返回 true,否则返回 false

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

等于运算符。如果对象o和受保护的指针p指向相同对象,则返回true,否则返回false

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

等于运算符。如果对象o和受保护的指针p指向相同对象,则返回true,否则返回false

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

等于运算符。如果由lhs保护的指针是nullptr,则返回true,否则返回false

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

等于运算符。如果由rhs保护的指针是nullptr,则返回true,否则返回false

© 2024 Qt公司。文档贡献的版权为各自所有者的版权。本处提供的文档是根据自由软件基金会发布的《GNU自由文档许可证第1.3版》的条款提供的。Qt以及相关的标识是芬兰以及/或其他国家的Qt公司的商标。所有其他商标均属于其各自所有者。