Класс QPointer
шаблон <typename T> class 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.2/qpointer.html