Qt图形图像开发之Qt滚动区控件QScrollArea怎么用

  

这篇文章主要介绍Qt图形图像开发之QT滚动区控件QScrollArea怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

QT滚动区控件(滚动条控件)QScrollArea简介

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

QScrollArea属于控件容器类,可以直接在ui中拖出来。

Qt图形图像开发之QT滚动区控件QScrollArea怎么用

对于QScrollArea,最难搞懂的就是:如何控制它,才能让它在我们想要出现滚动条的时候出现滚动条。

我们拖入一个QScrollArea,再向他里面拖入4个button,观察信息如下:

Qt图形图像开发之QT滚动区控件QScrollArea怎么用

可以发现,4个button并不是直接位于QScrollArea中的,而是位于它的成员scorllAreaWidgetContents中的,这个成员的类型也是控件类型QWidget,也就是说,QScrollArea这个容器本身就套了两层,我们放入的按钮等控件,都处在scrllAreaWidgetContents层,下文中我把QScrollArea.widget统一称之为“内部容器”或者"内容层",内部容器是QScrollArea这个控件的子控件。

"内容层"相当于一块很大的幕布,按钮、label等控件都被绘制在了幕布上,而QScrollArea相当于一个小窗口,透过这个小窗口我们看一看到幕布上的一小部分内容,拖动滚动条相当于在窗口后面移动幕布,这样我们就能透过窗口看到幕布上不同位置的内容。

这个幕布本质上就是一个QWidget,如果QScrollArea是从UI设计师界面拖出来的,那么QT会自动为我们创建这个幕布,如果你是用代码new出来的QScrollArea,那么不要忘记同时new一个幕布widget,并通过QScrollArea::setWidget(QWidget *)把幕布和QScrollArea关联起来。

这里有一个坑,如果你写了一个功能更强的QScrollArea的子类,假设叫QScrollAreaEx(里面自带幕布,幕布中自带一些按钮什么的),在ui设计师界面把QScrollArea提升为QScrollAreaEx的时候,你会发现,按钮并没有显示出来,why?因为QT自动生成的ui代码中,new了一个幕布控件,并把这个空的幕布赋给了QScrollAreaEx对象,这真是太坑了。解决方案有两种,①自己用代码new QScrollAreaEx,②在ui中拖出一个非QScrollArea的QWidget控件,然后提升为QScrollAreaEx。

一旦理解了幕布和观察窗口的关系,就能很容易的总结出QScrollArea的标准编程步骤,分这么几种情况:

QScrollArea纯代码实现

(1) new QscrollArea

(2) new 内部的幕布容器

(3) new 布局,例如网格布局QGridLayout(前3步不分先后顺序)或者你想用的其他布局

(4) 向布局中添加你想要的控件(这一步必须位于步骤3之后,这不是废话吗)

(5) 关联"幕布控件"和"布局"(如果在创建布局时,就把布局构造在了幕布控件中,那么这一步就省了)

(6) 给QScroolArea设置幕布,也即调用QScrollArea::setWidget(QWidget *),这一步必须位于步骤4、5之后。

#include "mainwindow.h"
  # include “ui_mainwindow.h"
  # include  & lt; QHBoxLayout>
  # include  & lt; QPushButton>
  # include  & lt; QScrollArea>
  ,
  主窗口:主窗口(QWidget  *父母),:
  QMainWindow才能(父),
  ui才能(new  ui::主窗口)
  {
  ui→才能setupUi(这个);
  ,
  QScrollArea  *,才能scrollArea =, new  QScrollArea(这个);
  QWidget  *,才能pWgt =, new  QWidget;
  ,
  QHBoxLayout 才能;* pLayout =, new  QHBoxLayout();//网格布的局
  ,,,(int 小姐:=,0;,小姐:& lt;, 100;,我+ +)
  ,,,{
  ,,,,,QPushButton  * pBtn =, new  QPushButton ();
  ,,,,,pBtn→setText (QString(“按钮% 1“).arg(我));
  ,,,,,pBtn→setMinimumSize (QSize (60, 30));,,//width 高度
  ,,,,,播出→addWidget (pBtn);//把按钮添加到布局控件中
  ,,,}
  pWgt→才能setLayout(播出);
  ,//这才能一句setWidget必须放在pWgt里面的内容都准备完毕之后,否则显示有问题
  scrollArea→才能setWidget (pWgt);
  setCentralWidget才能(scrollArea);
  }
  ,
  主窗口::~主窗口()
  {
  delete 才能;界面;
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null
  null

Qt图形图像开发之Qt滚动区控件QScrollArea怎么用