このページでは

QPointer Class

template <typename T> class QPointer

QPointer クラスは、QObject へのガード付きポインタを提供するテンプレートクラスです。詳細...

ヘッダー: #include <QPointer>
CMake: find_package(Qt6 REQUIRED COMPONENTS Core)
target_link_libraries(mytarget PRIVATE Qt6::Core)
qmake: QT += core

QPointer の比較

カテゴリ比較可能な型説明
等価性QPointer
等価性QPointer<X>、X*、および std::nullptr_t。ここで、X と T は互換性のある型、つまり(cv 修飾子をのぞいて)同じであるか、あるいは一方が他方の基底型である。

パブリック関数

QPointer()
(since 6.6) QPointer(QPointer<X> &&other)
QPointer(T *p)
(since 6.6) QPointer(const QPointer<X> &other)
QPointer(std::nullptr_t)
~QPointer()
void clear()
T *data() const
(since 6.0) T *get() const
bool isNull() const
void swap(QPointer<T> &other)
operator T *() const
T &operator*() const
T *operator->() const
(since 6.6.1) QPointer<T> &operator=(QPointer<X> &&other)
QPointer<T> &operator=(T *p)
(since 6.6) QPointer<T> &operator=(const QPointer<X> &other)
bool operator!=(X *const &lhs, const QPointer<T> &rhs)
bool operator!=(const QPointer<T> &lhs, X *const &rhs)
bool operator!=(const QPointer<T> &lhs, const QPointer<X> &rhs)
bool operator!=(const QPointer<T> &lhs, const std::nullptr_t &rhs)
bool operator!=(const std::nullptr_t &lhs, const QPointer<T> &rhs)
bool operator==(X *const &lhs, const QPointer<T> &rhs)
bool operator==(const QPointer<T> &lhs, X *const &rhs)
bool operator==(const QPointer<T> &lhs, const QPointer<X> &rhs)
bool operator==(const QPointer<T> &lhs, const std::nullptr_t &rhs)
bool operator==(const std::nullptr_t &lhs, const QPointer<T> &rhs)

詳細な説明

ガード付きポインタ QPointer<T> は、通常の C++ ポインタT * と同様に動作しますが、参照されるオブジェクトが破棄されたときに自動的にクリアされる点が異なります(通常の C++ ポインタは、そのような場合に「ダングリングポインタ」になります)。 テンプレートパラメータ `T ` は、参照先の `QObject` 派生型を指定します。`T ` は、QObject` のサブクラスでなければなりません。

ガード付きポインタは、他者が所有するQObject へのポインタを格納する必要があり、そのため、自分がその参照を保持している間にそのオブジェクトが破棄される可能性がある場合に役立ちます。このポインタの有効性を安全に確認することができます。

なお、Qt 5 では QPointer を使用する際の挙動に若干の変更が加えられています。

  • QWidget (またはQWidget のサブクラス)に対してQPointerを使用する場合、以前はQWidget のデストラクタによってQPointerがクリアされていました。現在では、QObject のデストラクタによってQPointerがクリアされます(これは、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!=( ) を使用してそれらを互いに比較したり、isNull() を使用してnullptr であるかどうかをテストしたりすることができます。*x またはx->member の表記のいずれかを使用して、それらを逆参照することができます。

ガード付きポインタは自動的にT *にキャストされるため、ガード付きポインタとガードなしポインタを自由に混在させることができます。 つまり、QPointer<QWidget> があれば、QWidget * を引数として要求する関数にそれを渡すことができます。このため、QPointer を引数として受け取る関数を宣言してもほとんど意味がありません。通常のポインタを使用してください。ポインタを長期間保存する場合に QPointer を使用してください。

なお、クラス `T ` は `QObject` を継承している必要があります。そうしないと、コンパイルエラーまたはリンクエラーが発生します。

QSharedPointer 、QObject 、およびQObjectCleanupHandlerも参照してください 。

メンバ関数のドキュメント

[noexcept default] QPointer::QPointer()

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

値 `nullptr` を持つガード付きポインタを構築します。

isNull()も参照してください 。

[noexcept, since 6.6] template <typename X> requires if_convertible<X> QPointer::QPointer(QPointer<X> &&other)

[noexcept, since 6.6] template <typename X> requires if_convertible<X> 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)

このポインタとother を交換します。この操作は非常に高速で、失敗することはありません。

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

キャスト演算子。ポインタのセマンティクスを実装します。この機能により、T*が要求される関数にQPointer<T>を渡すことができます。

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

参照解除演算子。ポインタのセマンティクスを実装しています。通常のC++ポインタと同じように、この演算子を使用してください。

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

オーバーロードされた矢印演算子。ポインタのセマンティクスを実装しています。この演算子は、通常の C++ ポインタと同じように使用してください。

[noexcept, since 6.6.1] template <typename X> requires if_convertible<X> QPointer<T> &QPointer::operator=(QPointer<X> &&other)

変換移動代入演算子。このガード付きポインタのガードを、other でガードされているオブジェクトと同じものにし、other を nullptr にリセットします。

制約

X* がT* に変換可能な場合にのみ、オーバーロード解決の対象となります。

この関数は Qt 6.6.1 で導入されました。

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

代入演算子。このガード付きポインタは、これでp が指しているのと同じオブジェクトを指すようになります。

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

変換代入演算子。このガード付きポインタを、other でガードされているのと同じオブジェクトをガードするようにします。

制約

X* がT* に変換可能な場合にのみ、オーバーロード解決の対象となります。

この関数は Qt 6.6 で導入されました。

関連する非メンバー関数

[noexcept] template <typename X> bool operator!=(X *const &lhs, const QPointer<T> &rhs)

不等号演算子。lhs であり、かつガード付きポインタrhs が同じオブジェクトを指していない場合は `true ` を返し、そうでない場合は `false` を返します。

[noexcept] template <typename X> bool operator!=(const QPointer<T> &lhs, X *const &rhs)

不等号演算子。rhs であり、かつガード付きポインタlhs が同じオブジェクトを指していない場合は `true ` を返し、それ以外の場合は `false` を返します。

[noexcept(...)] template <typename X> bool operator!=(const QPointer<T> &lhs, const QPointer<X> &rhs)

不等号演算子。ガード付きポインタ `lhs ` と `rhs ` が同じオブジェクトを指していない場合は `true ` を返し、そうでない場合は `false` を返します。

注: true がtrue の場合、この関数は noexcept です。

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

不等号演算子。lhs で保護されているポインタが有効な(つまり、nullptr ではない)ポインタである場合は `true ` を返し、そうでない場合は `false` を返します。

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

不等号演算子。rhs で保護されているポインタが有効な(つまり、nullptr ではない)ポインタである場合は、true を返し、そうでない場合はfalse を返します。

[noexcept] template <typename X> bool operator==(X *const &lhs, const QPointer<T> &rhs)

等価演算子。lhs と、ガード付きポインタrhs が同じオブジェクトを指している場合は `true ` を返し、そうでない場合は `false` を返します。

[noexcept] template <typename X> bool operator==(const QPointer<T> &lhs, X *const &rhs)

等価演算子。rhs とガード付きポインタlhs が同じオブジェクトを指している場合は `true ` を返し、そうでない場合は `false` を返します。

[noexcept(...)] template <typename X> bool operator==(const QPointer<T> &lhs, const QPointer<X> &rhs)

等号演算子。保護されたポインタ `lhs ` と `rhs ` が同じオブジェクトを指している場合は `true ` を返し、そうでない場合は `false` を返します。

注: true がtrue の場合、この関数は noexcept です。

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

等価演算子。lhs で保護されているポインタがnullptr である場合はtrue を返し、そうでない場合はfalse を返します。

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

等価演算子。rhs で保護されているポインタがnullptr である場合はtrue を返し、そうでない場合はfalse を返します。

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.