QAbstractScrollArea Class

QAbstractScrollArea ウィジェットは、オンデマンドスクロールバーを備えたスクロールエリアを提供します。詳細...

ヘッダ #include <QAbstractScrollArea>
CMake: find_package(Qt6 REQUIRED COMPONENTS Widgets)
target_link_libraries(mytarget PRIVATE Qt6::Widgets)
qmake: QT += widgets
を継承する: QFrame
によって継承される:

QAbstractItemView,QGraphicsView,QMdiArea,QPlainTextEdit,QScrollArea, およびQTextEdit

パブリックタイプ

enum SizeAdjustPolicy { AdjustIgnored, AdjustToContents, AdjustToContentsOnFirstShow }

プロパティ

パブリック関数

QAbstractScrollArea(QWidget *parent = nullptr)
virtual ~QAbstractScrollArea()
void addScrollBarWidget(QWidget *widget, Qt::Alignment alignment)
QWidget *cornerWidget() const
QScrollBar *horizontalScrollBar() const
Qt::ScrollBarPolicy horizontalScrollBarPolicy() const
QSize maximumViewportSize() const
QWidgetList scrollBarWidgets(Qt::Alignment alignment)
void setCornerWidget(QWidget *widget)
void setHorizontalScrollBar(QScrollBar *scrollBar)
void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy)
void setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy policy)
void setVerticalScrollBar(QScrollBar *scrollBar)
void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)
void setViewport(QWidget *widget)
virtual void setupViewport(QWidget *viewport)
QAbstractScrollArea::SizeAdjustPolicy sizeAdjustPolicy() const
QScrollBar *verticalScrollBar() const
Qt::ScrollBarPolicy verticalScrollBarPolicy() const
QWidget *viewport() const

再実装パブリック関数

virtual QSize minimumSizeHint() const override
virtual QSize sizeHint() const override

保護された関数

virtual void scrollContentsBy(int dx, int dy)
void setViewportMargins(const QMargins &margins)
void setViewportMargins(int left, int top, int right, int bottom)
virtual bool viewportEvent(QEvent *event)
QMargins viewportMargins() const
virtual QSize viewportSizeHint() const

再実装された保護された関数

virtual void contextMenuEvent(QContextMenuEvent *e) override
virtual void dragEnterEvent(QDragEnterEvent *event) override
virtual void dragLeaveEvent(QDragLeaveEvent *event) override
virtual void dragMoveEvent(QDragMoveEvent *event) override
virtual void dropEvent(QDropEvent *event) override
virtual bool event(QEvent *event) override
virtual void keyPressEvent(QKeyEvent *e) override
virtual void mouseDoubleClickEvent(QMouseEvent *e) override
virtual void mouseMoveEvent(QMouseEvent *e) override
virtual void mousePressEvent(QMouseEvent *e) override
virtual void mouseReleaseEvent(QMouseEvent *e) override
virtual void paintEvent(QPaintEvent *event) override
virtual void resizeEvent(QResizeEvent *event) override
virtual void wheelEvent(QWheelEvent *e) override

詳細説明

QAbstractScrollArea は、スクロール領域を低レベルで抽象化したものです。このエリアは、ビューポートと呼ばれる中央のウィジェットを提供し、その中でエリアのコンテンツがスクロールされます(つまり、コンテンツの可視部分がビューポートにレンダリングされます)。

ビューポートの隣には垂直スクロールバーがあり、その下には水平スクロールバーがあります。すべての領域コンテンツがビューポートに収まると、各スクロールバーは、スクロールバーのQt::ScrollBarPolicy に応じて表示または非表示にすることができます。スクロールバーが非表示になると、ビューポートはすべての利用可能なスペースをカバーするために拡張されます。スクロールバーが再び見えるようになると、ビューポートはスクロールバーのスペースを確保するために縮小します。

setViewportMargins() を参照してください。この機能は主に、QHeaderView ウィジェットをスクロール領域の上または横に配置するために使用されます。QAbstractScrollAreaのサブクラスはマージンを実装する必要があります。

QAbstractScrollAreaを継承する場合、以下のことを行う必要があります:

  • スクロールバーの範囲、値、ページステップを設定し、その動きを追跡することによって、スクロールバーを制御する。
  • スクロールバーの値に従って、ビューポートに領域の内容を描画する。
  • viewportEvent() で、ビューポートが受け取るイベント(特にリサイズイベント)を処理する。
  • すべての描画操作はビューポート上で行われるため、update() の代わりにviewport->update() を使用してビューポートの内容を更新します。

スクロールバーポリシーがQt::ScrollBarAsNeeded (デフォルト)の場合、QAbstractScrollArea は、スクロールバーがゼロ以外のスクロール範囲を提供する場合にスクロールバーを表示し、それ以外の場合に非表示にします。

スクロールバーとビューポートは、ビューポートがresizeイベントを受け取るか、コンテンツのサイズが変更されるたびに更新される必要があります。また、スクロールバーの値が変更されると、ビューポートも更新される必要があります。スクロールバーの初期値は、領域が新しいコンテンツを受信したときに設定されることがよくあります。

簡単な例として、任意のQWidget をスクロールできるスクロール・エリアを実装します。ウィジェットをビューポートの子にします。こうすることで、ウィジェットのどの部分を描画するかを計算する必要がなくなり、QWidget::move()で単純にウィジェットを移動できます。領域の内容やビューポートのサイズが変わったら、次のようにします:

    QSize areaSize = viewport()->size();
    QSize  widgetSize = widget->size();

    verticalScrollBar()->setPageStep(areaSize.height());
    horizontalScrollBar()->setPageStep(areaSize.width());
    verticalScrollBar()->setRange(0, widgetSize.height() - areaSize.height());
    horizontalScrollBar()->setRange(0, widgetSize.width() - areaSize.width());
    updateWidgetPosition();

スクロール・バーの値が変わったら、ウィジェットの位置を更新する、つまり、ビューポートに描画されるウィジェットの部分を見つける必要があります:

    int hvalue = horizontalScrollBar()->value();
    int vvalue = verticalScrollBar()->value();
    QPoint topLeft = viewport()->rect().topLeft();

    widget->move(topLeft.x() - hvalue, topLeft.y() - vvalue);

スクロールバーの動きを追跡するために、仮想関数scrollContentsBy()を再実装する。スクロール動作を微調整するには、スクロールバーのQAbstractSlider::actionTriggered() シグナルに接続し、QAbstractSlider::sliderPosition を調整します。

便宜上、QAbstractScrollAreaは、すべてのビューポートイベントを仮想viewportEvent()ハンドラで利用できるようにしています。QWidgetQAbstractScrollAreaの特殊ハンドラは、ビューポートイベントにリマップされます。リマップされた特殊ハンドラは次のとおりです:paintEvent(),mousePressEvent(),mouseReleaseEvent(),mouseDoubleClickEvent(),mouseMoveEvent(),wheelEvent(),dragEnterEvent(),dragMoveEvent(),dragLeaveEvent(),dropEvent(),contextMenuEvent(),resizeEvent()。

QScrollAreaQAbstractScrollAreaを継承したQAbstractScrollAreaは、QWidget (つまり、ウィジェットがピクセル単位でスクロールされる)に対してスムーズなスクロールを提供します。より特殊な動作が必要な場合のみ、QAbstractScrollAreaをサブクラス化する必要があります。これは例えば、領域の内容全体がQWidget に描画するのに適していない場合や、スムーズなスクロールを望まない場合に当てはまります。

QScrollAreaも参照してください

メンバ型ドキュメント

enum QAbstractScrollArea::SizeAdjustPolicy

この列挙型は、ビューポートのサイズが変更されたときに、QAbstractScrollArea のサイズヒントがどのように調整されるべきかを指定する。

定数説明
QAbstractScrollArea::AdjustIgnored0スクロールエリアは、以前のように動作し、調整は行いません。
QAbstractScrollArea::AdjustToContents2スクロールエリアは常にビューポートに合わせます。
QAbstractScrollArea::AdjustToContentsOnFirstShow1スクロールエリアは、それが最初に表示されたとき、そのビューポートに調整されます。

プロパティの説明

horizontalScrollBarPolicy : Qt::ScrollBarPolicy

このプロパティは、水平スクロールバーのポリシーを保持します。

デフォルトのポリシーはQt::ScrollBarAsNeeded です。

アクセス関数です:

Qt::ScrollBarPolicy horizontalScrollBarPolicy() const
void setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy)

verticalScrollBarPolicyも参照してください

sizeAdjustPolicy : SizeAdjustPolicy

このプロパティは、ビューポートのサイズが変化したときにスクロール領域のサイズがどのように変化するかを記述するポリシーを保持する。

デフォルトのポリシーはQAbstractScrollArea::AdjustIgnored です。このプロパティを変更すると、実際にスクロールエリアのサイズが変更される可能性があります。

アクセス関数:

QAbstractScrollArea::SizeAdjustPolicy sizeAdjustPolicy() const
void setSizeAdjustPolicy(QAbstractScrollArea::SizeAdjustPolicy policy)

verticalScrollBarPolicy : Qt::ScrollBarPolicy

このプロパティは、垂直スクロールバーのポリシーを保持します。

デフォルトのポリシーはQt::ScrollBarAsNeeded です。

アクセス関数です:

Qt::ScrollBarPolicy verticalScrollBarPolicy() const
void setVerticalScrollBarPolicy(Qt::ScrollBarPolicy)

horizontalScrollBarPolicyも参照してください

メンバ関数ドキュメント

[explicit] QAbstractScrollArea::QAbstractScrollArea(QWidget *parent = nullptr)

ビューポートを構築する。

parent 引数はQWidget コンストラクタに送られる。

[virtual noexcept] QAbstractScrollArea::~QAbstractScrollArea()

ビューポートを破壊する。

void QAbstractScrollArea::addScrollBarWidget(QWidget *widget, Qt::Alignment alignment)

alignment で指定された場所にスクロールバーウィジェットとしてwidget を追加します。

スクロール バー ウィジェットは、水平または垂直スクロール バーの横に表示され、その両側に配置できます。スクロールバーウィジェットを常に表示させたい場合は、対応するスクロールバーの scrollBarPolicy をAlwaysOn に設定してください。

alignment には、水平スクロールバーに対応する Qt::Alignleft と 、または垂直スクロールバーに対応する と のいずれかを指定します。Qt::AlignRight Qt::AlignTop Qt::AlignBottom

スクロールバー・ウィジェットを削除するには、ウィジェットのペアレントを変更するか、ウィジェットを削除します。また、QWidget::hide() でウィジェットを非表示にすることもできます。

スクロール バー ウィジェットは、現在のスタイルのスクロール バー ジオメトリに合わせてサイズが変更されます。以下は、水平スクロール バーのスクロール バー ウィジェットの場合です:

ウィジェットの高さは、スクロールバーの高さに合わせて設定されます。ウィジェットの幅を制御するには、QWidget::setMinimumWidthQWidget::setMaximumWidth を使用するか、QWidget::sizeHint() を実装して水平サイズ・ポリシーを設定します。正方形のウィジェットにしたい場合は、QStyle::pixelMetric(QStyle::PM_ScrollBarExtent) を呼び出し、幅をこの値に設定します。

scrollBarWidgets()も参照してください

[override virtual protected] void QAbstractScrollArea::contextMenuEvent(QContextMenuEvent *e)

再実装:QWidget::contextMenuEvent(QContextMenuEvent *event)を再実装します。

このイベントハンドラは、viewport() ウィジェットのコンテキストメニューイベントを受け取るために、サブクラスで再実装することができます。イベントはe で渡されます。

QWidget::contextMenuEvent()も参照してください

QWidget *QAbstractScrollArea::cornerWidget() const

2つのスクロールバーの間のコーナーにあるウィジェットを返します。

デフォルトでは、コーナーウィジェットは存在しません。

setCornerWidget()も参照してください

[override virtual protected] void QAbstractScrollArea::dragEnterEvent(QDragEnterEvent *event)

再実装:QWidget::dragEnterEvent(QDragEnterEvent *event)。

このイベントハンドラは、viewport() ウィジェットのドラッグ入力イベント(event で渡される)を受け取るために、サブクラスで再実装することができます。

QWidget::dragEnterEvent()も参照してください

[override virtual protected] void QAbstractScrollArea::dragLeaveEvent(QDragLeaveEvent *event)

再実装:QWidget::dragLeaveEvent(QDragLeaveEvent *event)。

このイベントハンドラは、viewport() ウィジェットのドラッグ離脱イベント(event で渡される)を受け取るために、サブクラスで再実装することができます。

QWidget::dragLeaveEvent()も参照してください

[override virtual protected] void QAbstractScrollArea::dragMoveEvent(QDragMoveEvent *event)

再実装:QWidget::dragMoveEvent(QDragMoveEvent *event)。

このイベントハンドラは、viewport() ウィジェットのドラッグ移動イベント(event で渡される)を受け取るために、サブクラスで再実装することができます。

QWidget::dragMoveEvent()も参照してください

[override virtual protected] void QAbstractScrollArea::dropEvent(QDropEvent *event)

再実装:QWidget::dropEvent(QDropEvent *event)。

このイベント・ハンドラは、viewport() ウィジェットのドロップ・イベント(event で渡される)を受け取るために、サブクラスで再実装することができます。

QWidget::dropEvent()も参照してください

[override virtual protected] bool QAbstractScrollArea::event(QEvent *event)

再インプリメント:QFrame::event(QEvent *e)。

これはQAbstractScrollArea ウィジェットスクロール領域viewport()ではない)のメインイベントハンドラです。指定されたevent は一般的なイベント・オブジェクトで、そのタイプによっては適切なクラスにキャストする必要があります。

QEvent::type()も参照してください

QScrollBar *QAbstractScrollArea::horizontalScrollBar() const

水平スクロール・バーを返します。

setHorizontalScrollBar()、horizontalScrollBarPolicy 、およびverticalScrollBar()も参照

[override virtual protected] void QAbstractScrollArea::keyPressEvent(QKeyEvent *e)

再実装:QWidget::keyPressEvent(QKeyEvent *event)。

この関数は、キーが押されたときにキーイベントe で呼び出されます。PageUp、PageDown、Up、Down、Left、Rightを処理し、それ以外のキー押下は無視します。

QSize QAbstractScrollArea::maximumViewportSize() const

スクロールバーに有効なスクロール範囲がないものとして、ビューポートのサイズを返す。

[override virtual] QSize QAbstractScrollArea::minimumSizeHint() const

QWidget::minimumSizeHint

[override virtual protected] void QAbstractScrollArea::mouseDoubleClickEvent(QMouseEvent *e)

再実装:QWidget::mouseDoubleClickEvent(QMouseEvent *event)。

このイベントハンドラは、viewport() ウィジェットのマウスダブルクリックイベントを受け取るために、サブクラスで再実装することができます。イベントはe で渡されます。

QWidget::mouseDoubleClickEvent()も参照してください

[override virtual protected] void QAbstractScrollArea::mouseMoveEvent(QMouseEvent *e)

再実装:QWidget::mouseMoveEvent(QMouseEvent *event)。

このイベントハンドラは、viewport() ウィジェットのマウス移動イベントを受け取るために、サブクラスで再実装することができます。イベントはe で渡されます。

QWidget::mouseMoveEvent()も参照してください

[override virtual protected] void QAbstractScrollArea::mousePressEvent(QMouseEvent *e)

再実装:QWidget::mousePressEvent(QMouseEvent *event)。

このイベントハンドラは、viewport() ウィジェットのマウス押下イベントを受け取るために、サブクラスで再実装することができます。イベントはe で渡されます。

デフォルトの実装では、デフォルトのポップアップ処理のためにQWidget::mousePressEvent() を呼び出します。

QWidget::mousePressEvent()も参照してください

[override virtual protected] void QAbstractScrollArea::mouseReleaseEvent(QMouseEvent *e)

再実装:QWidget::mouseReleaseEvent(QMouseEvent *event)。

このイベントハンドラは、viewport() ウィジェットのマウスリリースイベントを受け取るために、サブクラスで再実装することができます。イベントはe で渡されます。

QWidget::mouseReleaseEvent()も参照してください

[override virtual protected] void QAbstractScrollArea::paintEvent(QPaintEvent *event)

再実装:QFrame::paintEvent(QPaintEvent *)。

このイベント・ハンドラは、viewport() ウィジェットのペイント・イベント(event で渡される)を受け取るために、サブクラスで再実装することができます。

注意: QPainter を作成する場合は、viewport() で操作する必要があります。

QWidget::paintEvent()も参照してください

[override virtual protected] void QAbstractScrollArea::resizeEvent(QResizeEvent *event)

再実装:QWidget::resizeEvent(QResizeEvent *event)。

このイベントハンドラは、viewport() ウィジェットのリサイズイベント(event で渡される)を受け取るために、サブクラスで再実装することができます。

resizeEvent()が呼び出されたとき、ビューポートはすでに新しいジオメトリを持っています:新しいサイズはQResizeEvent::size() 関数から、古いサイズはQResizeEvent::oldSize() からアクセスできます。

QWidget::resizeEvent()も参照してください

QWidgetList QAbstractScrollArea::scrollBarWidgets(Qt::Alignment alignment)

現在設定されているスクロールバー・ウィジェットのリストを返す。alignment には4つの位置フラグの任意の組み合わせを指定できる。

addScrollBarWidget()も参照

[virtual protected] void QAbstractScrollArea::scrollContentsBy(int dx, int dy)

この仮想ハンドラは、スクロールバーがdx,dy によって移動され、その結果、ビューポートのコンテンツがそれに応じてスクロールされるべきときに呼び出される。

デフォルトの実装では、単純にviewport() 全体でupdate() を呼び出します。サブクラスでは、最適化のためにこのハンドラを再実装したり、QScrollArea のように、コンテンツ・ウィジェットを移動させたりすることができます。パラメータdxdy は、クラスがスクロールされるべき量を知るための便宜的なものです(ピクセルシフトを行う場合などに便利です)。これらの値を無視して、スクロール・バーが示す位置に直接スクロールすることもできます。

プログラム的にスクロールするためにこの関数を呼び出すのはエラーです。代わりにスクロールバーを使用してください(例えば、QScrollBar::setValue ()を直接呼び出す)。

void QAbstractScrollArea::setCornerWidget(QWidget *widget)

2つのスクロールバーの間のコーナーにあるウィジェットをwidget に設定します。

また、少なくとも1つのスクロールバーモードをAlwaysOn に設定したいでしょう。

nullptr を渡すと、コーナーにウィジェットは表示されません。

以前のコーナー・ウィジェットはすべて非表示になります。

setCornerWidget()は、同じウィジェットで複数回呼び出すことができます。

ここで設定されたすべてのウィジェットは、他のコーナー・ウィジェット(またはnullptr )を設定した後に別途ウィジェットを再保護しない限り、スクロール・エリアが破棄されるときに削除されます。

新しく設定されたウィジェットには、現在の親がないはずです。

デフォルトでは、コーナーウィジェットは存在しません。

cornerWidget(),horizontalScrollBarPolicy,horizontalScrollBarPolicyも参照してください

void QAbstractScrollArea::setHorizontalScrollBar(QScrollBar *scrollBar)

既存の水平スクロールバーをscrollBar に置き換え、以前のスクロールバーのスライダプロパティをすべて新しいスクロールバーに設定します。その後、以前のスクロールバーは削除されます。

QAbstractScrollArea は、デフォルトで水平および垂直スクロールバーを提供しています。この関数を呼び出すと、デフォルトの水平スクロールバーを独自のカスタムスクロールバーに置き換えることができます。

horizontalScrollBar() およびsetVerticalScrollBar()も参照して ください。

void QAbstractScrollArea::setVerticalScrollBar(QScrollBar *scrollBar)

既存の垂直スクロールバーをscrollBar に置き換え、以前のスクロールバーのスライダプロパティをすべて新しいスクロールバーに設定します。その後、以前のスクロールバーは削除されます。

QAbstractScrollArea は、デフォルトで垂直スクロールバーと水平スクロールバーを提供しています。この関数を呼び出すと、デフォルトの垂直スクロールバーを独自のスクロールバーに置き換えることができます。

verticalScrollBar() およびsetHorizontalScrollBar()も参照して ください。

void QAbstractScrollArea::setViewport(QWidget *widget)

ビューポートを与えられたwidget に設定する。QAbstractScrollArea は与えられたwidget の所有権を持つ。

widgetnullptr の場合、QAbstractScrollArea はビューポートに新しいQWidget インスタンスを割り当てます。

viewport()も参照

[protected] void QAbstractScrollArea::setViewportMargins(const QMargins &margins)

スクロール領域の周囲にmargins を設定する。これは、"ロックされた "行や列を持つスプレッドシートのようなアプリケーションに便利です。余白は空白のままです。未使用領域にウィジェットを配置します。

デフォルトではすべての余白はゼロです。

viewportMargins()も参照のこと

[protected] void QAbstractScrollArea::setViewportMargins(int left, int top, int right, int bottom)

lefttoprightbottom に、スクロール領域の余白を設定する。これは "ロックされた "行や列を持つスプレッドシートのようなアプリケーションに便利です。余白は空白のままなので、未使用領域にウィジェットを配置します。

この関数はQTreeViewQTableView から頻繁に呼び出されるので、余白はQAbstractScrollArea サブクラスで実装する必要があることに注意してください。また、サブクラスがアイテムビューで使用される場合は、この関数を呼び出すべきではありません。

デフォルトでは、すべてのマージンはゼロです。

viewportMargins()も参照してください

[virtual] void QAbstractScrollArea::setupViewport(QWidget *viewport)

このスロットは、setViewport(viewport) が呼び出された後に、QAbstractScrollArea によって呼び出される。この関数をQAbstractScrollArea のサブクラスで再実装し、新しいviewport が使用される前に初期化する。

setViewport()も参照

[override virtual] QSize QAbstractScrollArea::sizeHint() const

再実装:QFrame::sizeHint() const.

スクロール領域の sizeHint プロパティを返します。サイズはviewportSizeHint() を使用して決定され、必要に応じてスクロールバー用の余分なスペースが追加されます。

QScrollBar *QAbstractScrollArea::verticalScrollBar() const

垂直スクロール・バーを返す。

setVerticalScrollBar()、verticalScrollBarPolicy 、およびhorizontalScrollBar()も参照

QWidget *QAbstractScrollArea::viewport() const

ビューポート・ウィジェットを返します。

ビューポート・ウィジェットの内容を取得するには、QScrollArea::widget() 関数を使用します。

setViewport() およびQScrollArea::widget()も参照

[virtual protected] bool QAbstractScrollArea::viewportEvent(QEvent *event)

スクロール領域(viewport()ウィジェット)のメインイベントハンドラです。指定されたevent を処理し、妥当なデフォルト動作を提供するためにサブクラスによって呼び出すことができます。

イベントが処理され、それ以上処理する必要がないことをイベント・システムに示すためにtrue を返します。そうでない場合は、イベントをさらに伝播する必要があることを示すためにfalse を返します。

サブクラスでこの関数を再実装することもできますが、代わりに特殊なイベントハンドラのいずれかを使用することをお勧めします。

ビューポートイベントに特化したハンドラは以下のとおりです:paintEvent(),mousePressEvent(),mouseReleaseEvent(),mouseDoubleClickEvent(),mouseMoveEvent(),wheelEvent(),dragEnterEvent(),dragMoveEvent(),dragLeaveEvent(),dropEvent(),contextMenuEvent(),resizeEvent()。

[protected] QMargins QAbstractScrollArea::viewportMargins() const

スクロールエリアのマージンを返します。デフォルトでは、すべての余白は 0 です。

setViewportMargins()も参照

[virtual protected] QSize QAbstractScrollArea::viewportSizeHint() const

ビューポートの推奨サイズを返す。デフォルトの実装はviewport()->sizeHint() を返します。このサイズは、スクロールバーが表示されていないビューポートのサイズであることに注意してください。

[override virtual protected] void QAbstractScrollArea::wheelEvent(QWheelEvent *e)

再実装:QWidget::wheelEvent(QWheelEvent *event)。

このイベントハンドラは、viewport() ウィジェットのホイールイベントを受け取るために、サブクラスで再実装することができます。イベントはe で渡されます。

QWidget::wheelEvent()も参照してください

© 2025 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.