Qt--支持鼠标拖动来移动内容的QScrollArea视窗
2018-06-17 23:36:09来源:未知 阅读 ()
一、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:
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:C++学习
- Qt无边框窗口的移动、拉伸边框、鼠标滚轮缩放大小 2019-12-25
- QT解决中文乱码 2019-09-30
- QRowTable表格控件(五)-重写表头排序、支持第三次单击恢复默 2019-09-17
- Qt无边框窗体-最大化时支持拖拽还原 2019-08-27
- Qt实现表格树控件-支持多级表头 2019-08-16
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash