QScrollArea的使用

简述


  • QScrollArea提供了一个滚动视图到另一个部件。
  • 滚动区域用于显示一个画面中的子部件的内容。如果部件超过画面的大小,视图可以提供滚动条,这样就都可以看到部件的整个区域。

基本使用


  • QScrollArear容器里面的子部件必须使用setWidget()指定
  • 可以使用widget()函数来获取部件,视图可以使用setWidgetResizable()函数来调整大小。
  • 有两个便利的函数:ensureVisible()ensureWidgetVisible(),确保视口中的一定区域内容是可见的,必要时通过滚动内容。
QLabel *imageLabel =new QLabel(this);				//子部件
imageLabel->setPixmap(QPixmap(":/Images/head"));	
QScrollArea *scrollArea =new QScrollArea(this);		//设置容器背景色
scrollArea->setBackgroundRole(QPalette::Dark);  	//背景色
scrollArea->setWidget(imageLabel);					//容器加入子部件

对齐方式


  • 默认子部件的对齐方式为:水平居左,垂直居上。可以通过setAlignment(Qt::Alignment)来改变。
  • Qt::Alignment有很多可选项,分别表示水平和垂直方向的对齐方式,例如:左上右下。
scrollArea->setAlignment(Qt::AlignCenter);      //居中对齐
scrollArea->setAlignment(Qt::AlignLeft);        //左对齐
scrollArea->setAlignment(Qt::AlignRight);       //右对齐
scrollArea->setAlignment(Qt::AlignHCenter);     //水平对齐
scrollArea->setAlignment(Qt::AlignVCenter);     //垂直对齐
scrollArea->setAlignment(Qt::AlignBottom);      //下对齐
scrollArea->setAlignment(Qt::AlignTop);         //上对齐																

调整子部件大小


  • 默认情况下属性widgetResizable为false。即滚动不会改变widget的大小,也就是说QLabel子部件自适应QPixmap的大小。
  • 如果要调整部件大小,有两种可选方式。一般用自动调整 setWidgetResizable(true)

手动调整

  • 忽略这个属性,我们可以通过使用widget()->resize()来调整部件的大小,这时滚动区域会自动调整自身大小为新的尺寸。
QLabel *imageLabel =new QLabel(this);
QPixmap pixmap(":/Images/head");
pixmap = pixmap.scaled(200, 200, Qt::KeepAspectRatio); //图片缩放为200*200
imageLabel->setPixmap(pixmap);
imageLabel->setStyleSheet("background: white;");       //设置imageLabel为白色背景
imageLabel->setAlignment(Qt::AlignCenter);             //将pixmap图片居中

QScrollArea *scrollArea =new QScrollArea(this);		//定义QScrollArea容器
scrollArea->setBackgroundRole(QPalette::Dark);  	//设置容器背景
scrollArea->setWidget(imageLabel);					//加入子部件imageLabel
scrollArea->setAlignment(Qt::AlignCenter);  		//居中对齐

scrollArea->widget()->resize(260, 260);     		//手动调整子部件imageLabel的大小

自动调整【常用】

  • 如果widgetResizable被设置为true,则滚动区域子部件将自动调整,以避免可以不显示的滚动条,或者利用额外的空间。
QLabel *imageLabel =new QLabel(this);
QPixmap pixmap(":/Images/head");
pixmap = pixmap.scaled(200, 200, Qt::KeepAspectRatio);  //图片缩放为200*200
imageLabel->setPixmap(pixmap);
imageLabel->setStyleSheet("background: white;");        //设置imageLabel为白色背景
imageLabel->setAlignment(Qt::AlignCenter);              //将pixmap图片居中

QScrollArea *scrollArea =new QScrollArea(this);
scrollArea->setBackgroundRole(QPalette::Dark);          // 背景色
scrollArea->setWidget(imageLabel);
scrollArea->setAlignment(Qt::AlignCenter);              // 居中对齐

scrollArea->setWidgetResizable(true);                   // imageLabel自动调整大小

获取与移除部件


获取

  • 可以通过widget()函数来获取滚动区域的部件,如果没有,则返回0。
QWidget *widget = scrollArea->widget();

移除

  • 如果要将部件从滚动区域中移除(即:在上例中,滚动区域不再显示图片),使用takeWidget()函数。
QWidget *widget = scrollArea->takeWidget();
Qt中的`QScrollArea`是一个用于显示内容超出其窗口大小的小部件,当内容过大无法一次性展示完全时,它会自动添加滚动条以便用户可以查看所有内容。你可以将任何QWidget类型的控件放入到`QScrollArea`中,并设置它的布局、边距等属性。 下面是一些关键点: - **构造函数**:创建一个新的 `QScrollArea` 实例。 - **setWidget(QWidget *widget)** :此方法用于向 QScrollArea 中放置一个小部件作为滚动区域的内容。请注意每个 QScrollArea 只能包含一个主小部件;如果你想在同一区域内管理多个组件,则需要先在一个容器(例如 QVBoxLayout 或 QHBoxLayout 内的一个 QWidget)里布置好它们再把该容器加入到 QScrollArea 之中。 - **setVerticalScrollBarPolicy(Qt::ScrollBarPolicy policy) 和 setHorizontalScrollBarPolicy(Qt::ScrollBarPolicy policy)** : 设置垂直方向或水平方向上是否始终显示滚动条 (`Qt::ScrollBarAlwaysOn`) ,仅在必要时才出现滚动条(`Qt::ScrollBarAsNeeded`) , 或者从不显示滚动条 (`Qt::ScrollBarAlwaysOff`). 这里有一个简单的例子演示如何使用QScrollArea: ```cpp #include <QApplication> #include <QLabel> #include <QVBoxLayout> #include <QWidget> #include <QScrollArea> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 创建一个较大的 QLabel 来模拟大尺寸内容. QLabel* label = new QLabel("这是一个非常大的文本标签..."); QFont font; font.setPointSize(40); // 增加字体大小以保证内容足够大而触发滚动效果. label->setFont(font); // 将这个 QLabel 放入 Scroll Area . QScrollArea scroll_area; scroll_area.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn); scroll_area.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); scroll_area.setWidget(label); // 显示带了 Label 的 Scroll Area 窗口. scroll_area.show(); return app.exec(); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值