Класс QPointer
шаблон <typename T> class QPointerКласс QPointer — это шаблонный класс, предоставляющий защищённые указатели на QObject. Подробнее...
| Заголовок: | #include <QPointer> |
| qmake: | QT += core |
Открытые функции
| QPointer(T *p) | |
| QPointer() | |
| ~QPointer() | |
| void | clear() |
| T * | data() 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 T *o, const QPointer<T> &p) |
| bool | operator!=(const QPointer<T> &p, const T *o) |
| bool | operator!=(T *o, const QPointer<T> &p) |
| bool | operator!=(const QPointer<T> &p, T *o) |
| bool | operator!=(const QPointer<T> &p1, const QPointer<T> &p2) |
| bool | operator==(const T *o, const QPointer<T> &p) |
| bool | operator==(const QPointer<T> &p, const T *o) |
| bool | operator==(T *o, const QPointer<T> &p) |
| bool | operator==(const QPointer<T> &p, T *o) |
| bool | operator==(const QPointer<T> &p1, const QPointer<T> &p2) |
Подробное описание
Защищённый указатель 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()
Уничтожает защищённый указатель. Как и обычный указатель, уничтожение защищённого указателя не уничтожает объект, на который он указывает.
void QPointer::clear()
Очищает этот объект QPointer.
Эта функция была добавлена в Qt 5.0.
См. также isNull().
T *QPointer::data() const
Возвращает указатель на объект, который защищается.
Эта функция была добавлена в Qt 4.4.
bool QPointer::isNull() const
Возвращает true, если объект, на который он указывает, был уничтожен или если не существует связанного объекта; в противном случае возвращает false.
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 T> bool operator!=(const T *o, const QPointer<T> &p)
Оператор неравенства. Возвращает true если o и защищённый указатель p не указывают на один и тот же объект, в противном случае возвращает false.
template <typename T> bool operator!=(const QPointer<T> &p, const T *o)
Оператор неравенства. Возвращает true если o и защищённый указатель p не указывают на один и тот же объект, в противном случае возвращает false.
template <typename T> bool operator!=(T *o, const QPointer<T> &p)
Оператор неравенства. Возвращает true если o и защищённый указатель p не указывают на один и тот же объект, в противном случае возвращает false.
template <typename T> bool operator!=(const QPointer<T> &p, T *o)
Оператор неравенства. Возвращает true если o и защищённый указатель p не указывают на один и тот же объект, в противном случае возвращает false.
template <typename T> bool operator!=(const QPointer<T> &p1, const QPointer<T> &p2)
Оператор неравенства. Возвращает true если защищённые указатели p1 и p2 не указывают на один и тот же объект, в противном случае возвращает false.
template <typename T> bool operator==(const T *o, const QPointer<T> &p)
Оператор равенства. Возвращает true если o и защищённый указатель p указывают на один и тот же объект, в противном случае возвращает false.
template <typename T> bool operator==(const QPointer<T> &p, const T *o)
Оператор равенства. Возвращает true если o и защищённый указатель p указывают на один и тот же объект, в противном случае возвращает false.
template <typename T> bool operator==(T *o, const QPointer<T> &p)
Оператор равенства. Возвращает true если o и защищённый указатель p указывают на один и тот же объект, в противном случае возвращает false.
template <typename T> bool operator==(const QPointer<T> &p, T *o)
Оператор равенства. Возвращает true если o и защищённый указатель p указывают на один и тот же объект, в противном случае возвращает false.
template <typename T> bool operator==(const QPointer<T> &p1, const QPointer<T> &p2)
Оператор равенства. Возвращает true если защищённые указатели p1 и p2 указывают на один и тот же объект, в противном случае возвращает false.
© The Qt Company Ltd
Licensed under the GNU Free Documentation License, Version 1.3.
https://doc.qt.io/qt-5.15/qpointer.html