程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Qt--支持鼠標拖動來移動內容的QScrollArea視窗,qt--qscrollarea

Qt--支持鼠標拖動來移動內容的QScrollArea視窗,qt--qscrollarea

編輯:C++入門知識

Qt--支持鼠標拖動來移動內容的QScrollArea視窗,qt--qscrollarea


一、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:

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved