QPointer 类
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(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) |
(自 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时引入了一些行为上的细微变化。
- 当在 QWidget(或 QWidget 的子类)上使用 QPointer 时,之前 QPointer 由 QWidget 析构函数清除。现在,QPointer 由 QObject 析构函数清除(因为这时会清除 QWeakPointer 对象)。任何跟踪Widgets的 QPointers 将 不会 在 QWidget 析构函数销毁跟踪的Widgets的子项之前被清除。
Qt 还提供了 QSharedPointer,这是一个引用计数共享指针对象的实现,可用于维护一组指向单个指针的引用。
示例
如果在此时删除了 QLabel,则 label
变量将保留空指针 nullptr
,而不是无效地址,并且最后一行永远不会执行。
QPointer具有与普通非受保护指针相同的功能和运算符,只是指针运算符(+
、-
、++
和 --
),这些通常只用于对象的数组。
像普通指针一样使用QPointer,您就不需要阅读此类文档了。
要创建保护指针,您可以从 T* 或同一类型的另一个保护指针构造或分配给它们。您可以使用 operator==() 和 operator!=() 比较它们,或者使用 isNull() 测试 nullptr
。您可以使用 *x
或 x->member
符号来解引用它们。
保护指针将自动转换为 T
*,这意味着您可以自由混合受保护和不受保护的指针。这意味着如果您有一个 QPointer<QWidget>,您可以将它传递给需要一个 QWidget * 的函数。因此,声明接受 QPointer 作为参数的函数几乎没有任何价值;只需使用普通指针即可。在存储指针时使用QPointer。
请注意,类 T
必须继承自 QObject,否则会引发编译或链接错误。
另请参阅 QSharedPointer、QObject 和 QObjectCleanupHandler。
成员函数文档
创建一个值为 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)
交换此QPointer与other的内容。此操作非常快,且从不失败。
[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)
不等式运算符。如果保护指针 p1 和 p2 不指向同一对象,则返回 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> &)
相等运算符。如果保护指针 p1 和 p2 指向同一对象,则返回 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公司。文档贡献的版权为各自所有者的版权。本处提供的文档是根据自由软件基金会发布的