1. 程式人生 > 其它 >基本Widgets(24):【類】QScrollArea [官翻]

基本Widgets(24):【類】QScrollArea [官翻]

技術標籤:Qt

文章目錄

QScrollArea Class

QScrollArea類提供了一個到另一個小部件的滾動檢視。

Header#include < QScrollArea>
qmakeQT += widgets
InheritsQAbstractScrollArea
Inherited By

詳細說明

滾動區域用於顯示框架內子小部件的內容。如果小部件超過了框架的大小,檢視可以提供滾動條,以便可以檢視子小部件的整個區域。必須使用setWidget() 指定子小部件。例如:

 QLabel *imageLabel = new QLabel;
 QImage image("happyguy.png");
 imageLabel->setPixmap(QPixmap::fromImage(image));

 scrollArea = new QScrollArea;
 scrollArea->setBackgroundRole(QPalette::Dark);
 scrollArea->setWidget(imageLabel);

上面的程式碼建立了一個包含影象標籤的滾動區域(如下圖所示)。縮放影象時,滾動區域可以提供必要的滾動條:

滾動條的外觀取決於當前設定的滾動條策略。您可以使用從QAbstractScrollArea繼承的功能來控制滾動條的外觀。

例如,可以設定QAbstractScrollArea::horizontalScrollBarPolicy和QAbstractScrollArea::verticalScrollBarPolicy屬性。或者,如果希望滾動條在滾動區域的內容更改時動態調整,可以使用horizontalScrollBar() 和verticalScrollBar() 函式(使您能夠訪問滾動條)並在滾動區域的內容更改時使用QScrollBar::setValue() 函式設定滾動條的值。

可以使用widget() 函式檢索子小部件。可以使用setWidgetResizable() 函式調整檢視的大小。可以使用setAlignment() 指定小部件的對齊方式。

兩個方便的函式ensureVisible() 和ensureWidgetVisible() 通過在必要時滾動內容,確保在視口中可以看到內容的特定區域。

尺寸提示和佈局

當使用滾動區域顯示自定義小部件的內容時,確保子小部件的大小提示設定為合適的值非常重要。如果標準的QWidget用於子小部件,則可能需要呼叫QWidget::setMinimumSize() ,以確保小部件的內容在滾動區域中正確顯示。

如果使用滾動區域來顯示包含佈局中排列的子小部件的小部件的內容,則必須認識到佈局的大小策略也將決定小部件的大小。如果要動態更改佈局的內容,這一點尤其有用。在這種情況下,將版面的“大小約束”屬性設定為對版面的最小和/或最大大小提供約束的屬性(例如,QLayout::SetMinAndMaxSize)將導致每當版面的內容更改時,滾動區域的大小都會更新。

有關使用QScrollArea類的完整示例,請參見影象檢視器示例。該示例演示如何組合QLabel和QScrollArea來顯示影象。

屬性

  1. alignment: Qt::Alignment 滾動區域小部件的對齊方式

    有效的對齊方式是以下標誌的組合:

    • Qt::AlignLeft
    • Qt::AlignHCenter
    • Qt::AlignRight
    • Qt::AlignTop
    • Qt::AlignVCenter
    • Qt::AlignBottom

    預設情況下,小部件保持根在滾動區域的左上角。

    Access functions:

    • Qt::Alignment alignment() const
    1. void setAlignment(Qt::Alignment)
  2. widgetResizable: bool 滾動區域是否應調整檢視小部件的大小

    如果此屬性設定為false(預設值),則滾動區域接受其小部件的大小。
    不管此屬性如何,您都可以使用widget()->resize() 以程式設計方式調整小部件的大小,滾動區域將自動調整為新的大小。
    如果此屬性設定為true,滾動區域將自動調整小部件的大小,以避免滾動條出現在可以避免的地方,或者利用額外的空間。

    Access functions:

    • bool widgetResizable() const
    1. void setWidgetResizable(bool resizable)

公共函式

構造和析構

  1. QScrollArea(QWidget *parent = nullptr)
  2. virtual ~QScrollArea()

屬性相關

  1. Qt::Alignment alignment() const
  2. void setAlignment(Qt::Alignment)
  3. bool widgetResizable() const
  4. void setWidgetResizable(bool resizable)

特殊

  1. void ensureVisible(int x, int y, int xmargin = 50, int ymargin = 50)

    滾動滾動區域的內容,使點(x,y)在視口區域內可見,邊距由xmargin和ymargin以畫素為單位指定。

    如果無法到達指定點,內容將滾動到最近的有效位置。兩個邊距的預設值都是50畫素。

  2. void ensureWidgetVisible(QWidget *childWidget, int xmargin = 50, int ymargin = 50)

    滾動滾動區域的內容,以便QScrollArea::widget() 的childWidget在視口中可見,邊距由xmargin和ymargin以畫素為單位指定。
    如果無法到達指定點,內容將滾動到最近的有效位置。兩個邊距的預設值都是50畫素。

  3. QWidget * widget() const 返回滾動區域的小部件,如果沒有則返回nullptr。

  4. void setWidget(QWidget *widget) 設定滾動區域的小部件。

    小部件將成為滾動區域的子部件,並且在刪除滾動區域或設定新小部件時將被銷燬。
    小部件的autoFillBackground屬性將設定為true。
    如果新增小部件時滾動區域可見,則必須顯式顯示它。
    請注意,在呼叫此函式之前必須新增小部件的佈局;如果稍後新增,則無論何時顯示滾動區域,小部件都將不可見。在這種情況下,以後也不能show() 小部件。

  5. QWidget * takeWidget() 移除滾動區域的小部件,並將小部件的所有權傳遞給呼叫者。

重寫的公共函式

  1. virtual bool focusNextPrevChild(bool next) override
  2. virtual QSize sizeHint() const override

重寫的受保護函式

  1. virtual bool event(QEvent *e) override
  2. virtual bool eventFilter(QObject *o, QEvent *e) override
  3. virtual void resizeEvent(QResizeEvent *) override
  4. virtual void scrollContentsBy(int dx, int dy) override
  5. virtual QSize viewportSizeHint() const override

小示例

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-KvhsvvSe-1611659682181)(E:\Users\Desktop\1.png)]

#include <QtWidgets>

int main(int argc, char *argv[])
{
    QApplication app(argc,argv);
    app.setApplicationName ("QScrollArea");

    QScrollArea w;

    w.setContentsMargins (20,30,20,30);

    QFrame widget1;
    widget1.setMinimumSize (800,600);
    widget1.setFrameStyle (QFrame::Panel | QFrame::Plain );
    widget1.setLineWidth (10);
    widget1.setMidLineWidth (10);
    widget1.setStyleSheet ("background:magenta");

    QFrame corner;
    corner.setStyleSheet ("background:green");
    corner.setFrameStyle (QFrame::WinPanel | QFrame::Sunken );

    w.setCornerWidget (&corner);
    w.setWidget (&widget1);

    w.show ();
    app.exec();
    return 0;
}

參考

  • Image Viewer Exampl