Класс QPointer
шаблон <typename T> класс QPointerКласс QPointer — это шаблонный класс, предоставляющий защищённые указатели на QObject. Подробнее...
| Заголовок: | #include <QPointer> |
| CMake: | find_package(Qt6 COMPONENTS Core REQUIRED) target_link_libraries(mytarget PRIVATE Qt6::Core) |
| qmake: | QT += core |
Открытые функции
| QPointer(T *p) | |
| QPointer() | |
| ~QPointer() | |
| void | clear() |
| T * | data() const |
| T * | get() const |
| bool | isNull() const |
| void | swap(QPointer<T> &other) |
| T * | operator T *() const |
| T & | operator*() const |
| T * | operator->() const |
| 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). Любые QPointer, отслеживающие виджет, НЕ БУДУТ очищены до того, как деструктор QWidget уничтожит дочерние элементы отслеживаемого виджета.
Qt также предоставляет QSharedPointer, реализацию ссылочно-счётного умного указателя, который может использоваться для поддержания коллекции ссылок на отдельный указатель.
Пример:
QPointer<QLabel> label = new QLabel;
label->setText("&Status:");
...
if (label)
label->show(); Если QLabel будет удалён в это время, переменная label будет содержать nullptr вместо некорректного адреса, и последняя строка никогда не будет выполнена.
Функции и операторы, доступные с QPointer, такие же, как и у обычного незащищённого указателя, за исключением операторов арифметики указателей (+, -, ++, и --), которые обычно используются только с массивами объектов.
Используйте QPointer, как обычные указатели, и вам не придётся читать эту документацию по классу.
Для создания защищённых указателей можно создать или присвоить их из T* или из другого защищённого указателя того же типа. Вы можете сравнить их друг с другом, используя operator==() и operator!=(), или проверить на nullptr с помощью isNull(). Вы можете обращаться к ним с помощью обозначения *x или x->member.
Защищённый указатель будет автоматически приводиться к T *, поэтому вы можете свободно смешивать защищённые и незащищённые указатели. Это означает, что если у вас есть QPointer<QWidget>, вы можете передать его в функцию, которая требует QWidget *. По этой причине объявление функций, принимающих QPointer в качестве параметра, мало имеет смысла; просто используйте обычные указатели. Используйте QPointer, когда вы храните указатель со временем.
Обратите внимание, что класс T должен наследоваться от QObject, в противном случае произойдёт ошибка компиляции или компоновки.
См. также QSharedPointer, QObject и QObjectCleanupHandler.
Документация по функциям-членам
QPointer::QPointer(T *p)
Создаёт защищённый указатель, указывающий на тот же объект, что и p.
QPointer::QPointer()
Создаёт защищённый указатель со значением nullptr.
См. также isNull().
QPointer::~QPointer()
Уничтожает защищённый указатель. Как и обычный указатель, уничтожение защищённого указателя не уничтожает объект, на который он указывает.
[since 5.0] void QPointer::clear()
Очищает этот объект QPointer.
Эта функция была введена в Qt 5.0.
См. также isNull().
T *QPointer::data() const
Возвращает указатель на защищаемый объект.
[since 6.0] T *QPointer::get() const
То же, что и data(). Эта функция предоставлена для совместимости со STL.
Эта функция была введена в Qt 6.0.
bool QPointer::isNull() const
Возвращает true, если ссылка на объект была уничтожена или если нет объекта ссылки; в противном случае возвращает false.
[since 5.6] void QPointer::swap(QPointer<T> &other)
Меняет содержимое этого QPointer на содержимое other. Эта операция очень быстрая и никогда не терпит неудачу.
Эта функция была введена в Qt 5.6.
T *QPointer::operator T *() const
Оператор приведения типа; реализует семантику указателя. Благодаря этой функции вы можете передать QPointer<T> в функцию, где требуется T*.
T &QPointer::operator*() const
Оператор разыменования; реализует семантику указателя. Просто используйте этот оператор так же, как и с обычным C++ указателем.
T *QPointer::operator->() const
Перегруженный оператор стрелки; реализует семантику указателя. Просто используйте этот оператор так же, как и с обычным C++ указателем.
QPointer<T> &QPointer::operator=(T *p)
Оператор присваивания. Этот защищённый указатель теперь указывает на тот же объект, на который указывает p.
Связанные нечлены
template <typename X> bool operator!=(const QPointer<T> &p1, const QPointer<X> &p2)
Оператор неравенства. Возвращает true, если защищённые указатели p1 и p2 не указывают на один и тот же объект, в противном случае возвращает false.
template <typename X> bool operator!=(const QPointer<T> &p, X *o)
Оператор неравенства. Возвращает true, если o и защищённый указатель p не указывают на один и тот же объект, в противном случае возвращает false.
template <typename X> bool operator!=(X *o, const QPointer<T> &p)
Оператор неравенства. Возвращает true, если o и защищённый указатель p не указывают на один и тот же объект, в противном случае возвращает false.
bool operator!=(const QPointer<T> &lhs, std::nullptr_t)
Оператор неравенства. Возвращает true, если указатель, защищённый lhs, является валидным (т.е. не nullptr) указателем, в противном случае возвращает false.
bool operator!=(std::nullptr_t, const QPointer<T> &rhs)
Оператор неравенства. Возвращает true, если указатель, защищённый rhs, является валидным (т.е. не nullptr) указателем, в противном случае возвращает false.
template <typename X> bool operator==(const QPointer<T> &p1, const QPointer<X> &p2)
Оператор равенства. Возвращает true, если защищённые указатели p1 и p2 указывают на один и тот же объект, в противном случае возвращает false.
template <typename X> bool operator==(const QPointer<T> &p, X *o)
Оператор равенства. Возвращает true, если o и защищённый указатель p указывают на один и тот же объект, в противном случае возвращает false.
template <typename X> bool operator==(X *o, const QPointer<T> &p)
Оператор равенства. Возвращает true, если o и защищённый указатель p указывают на один и тот же объект, в противном случае возвращает false.
bool operator==(const QPointer<T> &lhs, std::nullptr_t)
Оператор равенства. Возвращает true, если указатель, защищённый lhs, является nullptr, в противном случае возвращает false.
bool operator==(std::nullptr_t, const QPointer<T> &rhs)
Оператор равенства. Возвращает true, если указатель, защищённый rhs, является nullptr, в противном случае возвращает false.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-6.1/qpointer.html