一、QScrollArea用法:
1、手動寫代碼:
1 QLabel *imageLabel = new QLabel;
2 QImage image("temp.png");
3 imageLabel->setPixmap(QPixmap::fromImage(image));
4 QScrollArea *scrollArea = new QScrollArea; //構造一個滾動區,繼承於QFrame
5 scrollArea->setBackgroundRole(QPalette::Dark);
6 scrollArea->setWidget(imageLabel); //將這個widget放進scrollArea
2、直接在Qt Designer中拖進一個Scroll Area控件,這時候會自動生成一個QWidget::scrollAreaWidgetContents填入QScrollArea中。也可以將類QScrollArea提升為自己定義的類MyScrollArea:

指定滾動條策略:
QAbstractScrollArea::verticalScrollBarPolicy 垂直滾動條
QAbstractScrollArea::horizontalScrollBarPolicy 水平滾動條
Qt::ScrollBarAsNeeded 0 滾動條需要時顯示
Qt::ScrollBarAlwaysOff 1 滾動條一直隱藏
Qt::ScrollBarAlwaysOn 2 滾動條一直顯示

注意:當用scrollArea顯示自定義widget的時候,確定這個窗口合適的大小很重要。
如果是一個標准的QWidget,有必要通過QWidget::setMinimumSize()設置一下這個控件的最小大小,這樣當scrollArea只要小於這個值,scrollArea就能自動顯示出滾動條了。
否則,QWidget就會自適應scrollArea滾動區的大小,scrollArea的滾動條顯示不出來,不能實現滾動效果。
可以通過Qt designer設置屬性值:


二、支持鼠標拖動來移動內容的自定義類MyScrollArea,代碼如下:
myscrollarea.h
1 #ifndef MYSCROLLAREA_H
2 #define MYSCROLLAREA_H
3
4 #include <QObject>
5 #include <QScrollArea>
6 #include <QPoint>
7
8 class MyScrollArea : public QScrollArea
9 {
10 Q_OBJECT
11
12 public:
13 MyScrollArea(QWidget* parent = NULL);
14 ~MyScrollArea();
15
16 protected:
17 bool eventFilter(QObject *obj,QEvent *evt);
18
19 private:
20 bool mMoveStart;
21 bool mContinuousMove;
22 QPoint mMousePoint;
23 };
24
25 #endif // MYSCROLLAREA_H
myscrollarea.cpp
1 #include "myscrollarea.h"
2 #include <QMouseEvent>
3 #include <QScrollBar>
4 //#include "myscrollbar.h"
5
6 MyScrollArea::MyScrollArea(QWidget *parent)
7 :QScrollArea(parent) //基類
8 ,mMoveStart(false)
9 ,mContinuousMove(false)
10 ,mMousePoint(QPoint(0,0))
11 {
12 installEventFilter(this);
13 }
14
15 MyScrollArea::~MyScrollArea()
16 {
17 }
18
19 bool MyScrollArea::eventFilter(QObject *obj, QEvent *evt)
20 {
21 if(evt->type() == QEvent::MouseMove)
22 {
23 QMouseEvent *me = (QMouseEvent*) evt;
24 if(me->buttons() & Qt::LeftButton)
25 {
26 if(!mMoveStart)
27 {
28 // if(me->pos().y() < (horizontalScrollBar()->pos().y() + horizontalScrollBar()->height())
29 // || me->pos().x() < (verticalScrollBar()->pos().x() + verticalScrollBar()->width()) )
30 // return false;
31
32 mMoveStart = true;
33 mContinuousMove = false;
34 mMousePoint = me->globalPos();
35 }
36 else
37 {
38 // MyScrollBar *scrollBarx = (MyScrollBar*)horizontalScrollBar();
39 // MyScrollBar *scrollBary = (MyScrollBar*)verticalScrollBar();
40
41 QScrollBar *scrollBarx = horizontalScrollBar();
42 QScrollBar *scrollBary = verticalScrollBar();
43
44 QPoint p = me->globalPos();
45 int offsetx = p.x() - mMousePoint.x();
46 int offsety = p.y() - mMousePoint.y();
47 if(!mContinuousMove && (offsetx > -10 && offsetx < 10) && (offsety > -10 && offsety < 10))
48 return false;
49
50 mContinuousMove = true;
51
52 scrollBarx->setValue(scrollBarx->value() - offsetx);
53 scrollBary->setValue(scrollBary->value() - offsety);
54 mMousePoint = p;
55 }
56 return true;
57 }
58 }
59 else if(evt->type() == QEvent::MouseButtonRelease)
60 {
61 mMoveStart = false;
62 }
63 return QObject::eventFilter(obj,evt);
64 }
Demo:
