Qt 实现在窗口内拖动图片

原创 2016年08月29日 16:09:56

Qt在窗口内拖动图片

label中显示图片,把label放在QScrollArea中,当窗口内显示图片,当图片大小超过窗口时出现滚动条,当鼠标点击左键在窗口内移动时,窗口的滚动条和内容随鼠标移动而变化。

安装过滤器,对鼠标事件进行处理。并对滚动条进行属性设置。

头文件:

 

#ifndef SCROLLAREA_H
#define SCROLLAREA_H

#include <QScrollArea>
#include <QPoint>

class ScrollArea : public QScrollArea
{
    Q_OBJECT

public:
    ScrollArea(QWidget* parent =NULL);
    ~ScrollArea();

protected:
    bool eventFilter(QObject *obj, QEvent *evt);

 private:
    bool mMoveStart;
    bool mContinuousMove;
    QPoint mMousePoint;

};
#endif // SCROLLAREA_H

源文件:

#include "scrollarea.h"
#include <QMouseEvent>
#include <QScrollBar>
#include <QDebug>

ScrollArea::ScrollArea(QWidget* parent)
    : QScrollArea(parent)
    , mMoveStart(false)
{
    installEventFilter(this);
    horizontalScrollBar()->setStyleSheet("QScrollBar:horizontal"
                                         "{"
                                         "height:8px;"
                                         "background:rgba(0,0,0,0%);"
                                         "margin:0px,0px,0px,0px;"
                                         "padding-left:0px;"
                                         "padding-right:0px;"
                                         "}"
                                         "QScrollBar::handle:horizontal"
                                         "{"
                                         "height:8px;"
                                         "background:rgba(0,0,0,25%);"
                                         " border-radius:4px;"
                                         "min-height:20;"
                                         "}"
                                         "QScrollBar::handle:horizontal:hover"
                                         "{"
                                         "height:8px;"
                                         "background:rgba(0,0,0,50%);"
                                         " border-radius:4px;"
                                         "min-height:20;"
                                         "}"
                                         "QScrollBar::add-line:horizontal"
                                         "{"
                                         "height:0px;width:0px;"
                                         "subcontrol-position:bottom;"
                                         "}"
                                         "QScrollBar::sub-line:horizontal"
                                         "{"
                                         "height:0px;width:0px;"
                                         "subcontrol-position:top;"
                                         "}"
                                         "QScrollBar::add-page:horizontal,QScrollBar::sub-page:horizontal"
                                         "{"
                                         "background:rgba(0,0,0,10%);"
                                         "border-radius:4px;"
                                         "}"
                                         );
    verticalScrollBar()->setStyleSheet("QScrollBar:vertical"
                                       "{"
                                       "width:8px;"
                                       "background:rgba(0,0,0,0%);"
                                       "margin:0px,0px,0px,0px;"
                                       "padding-top:0px;"
                                       "padding-bottom:0px;"
                                       "}"
                                       "QScrollBar::handle:vertical"
                                       "{"
                                       "width:8px;"
                                       "background:rgba(0,0,0,25%);"
                                       " border-radius:4px;"
                                       "min-height:20;"
                                       "}"
                                       "QScrollBar::handle:vertical:hover"
                                       "{"
                                       "width:8px;"
                                       "background:rgba(0,0,0,50%);"
                                       " border-radius:4px;"
                                       "min-height:20;"
                                       "}"
                                       "QScrollBar::add-line:vertical"
                                       "{"
                                       "height:0px;width:0px;"
                                       "subcontrol-position:bottom;"
                                       "}"
                                       "QScrollBar::sub-line:vertical"
                                       "{"
                                       "height:0px;width:0px;"
                                       "subcontrol-position:top;"
                                       "}"
                                       "QScrollBar::add-page:vertical,QScrollBar::sub-page:vertical"
                                       "{"
                                       "background:rgba(0,0,0,10%);"
                                       "border-radius:4px;"
                                       "}"
                                       );
}

ScrollArea::~ScrollArea()
{

}

bool ScrollArea::eventFilter(QObject *obj, QEvent *evt)
{
    if (evt->type() == QEvent::MouseMove) {
        QMouseEvent* mouseEvent = (QMouseEvent*) evt;
        if ((mouseEvent->buttons() & Qt::LeftButton)) {
            if (!mMoveStart) {
                mMoveStart = true;
                mContinuousMove =false;
                mMousePoint = mouseEvent->globalPos();
            }

            else {
                QPoint mousePoint = mouseEvent->globalPos();

                int x_offset = mousePoint.y() - mMousePoint.y();
                int y_offset = mousePoint.x() - mMousePoint.x();
                mContinuousMove = true;

                setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);//开启滚动条
                setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

                QScrollBar *vScrollBar=verticalScrollBar();
                QScrollBar *hScrollBar=horizontalScrollBar();

                vScrollBar->setValue(vScrollBar->value() - x_offset);
                hScrollBar->setValue(hScrollBar->value() - y_offset);

                mMousePoint = mousePoint;
            }
            return true;
        }
    }
    else if (evt->type() == QEvent::MouseButtonRelease) {
        mMoveStart = false;
        setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//关闭滚动条
        setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    }

    return QObject::eventFilter(obj, evt);
}


 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

Qt学习笔记之图片的上下左右移动

自己找的图片太大,在移动的时候不明显,懒得再找图片,所以用了QPainter将图片画在了label上 代码如下void Widget::paintEvent(QPaintEvent *) { ...
  • guoqianqian5812
  • guoqianqian5812
  • 2016年04月08日 19:03
  • 3471

QT界面简单的图形移动和鼠标绘图

QT界面图形移动及鼠标绘图
  • K54387
  • K54387
  • 2017年09月10日 22:25
  • 253

QT 图片查看软件,移动效果+图片倒影

  • 2011年01月14日 12:50
  • 1.35MB
  • 下载

qt实现图片放大缩小移动

qt怎么实现在图片上做批注? qt怎么实现图片放大缩小移动? qt怎么实现图片翻转?...
  • chenyijun
  • chenyijun
  • 2014年04月20日 16:59
  • 1279

编写程序,实现使用键盘上的上下左右箭头控制界面上图片的移动。

编写程序,实现使用键盘上的上下左右箭头控制界面上图片的移动。
  • Wang_Hong_Yi
  • Wang_Hong_Yi
  • 2017年06月11日 15:21
  • 946

qt中的拖拽及其使用技巧

关于qt中的拖放操作,首先可以看这篇官方文档:http://doc.qt.io/qt-5.5/dnd.html 一、QDrag 首先是创建QDrag,可以在mousePressEvent或者mouse...
  • vvsxr
  • vvsxr
  • 2015年10月24日 13:18
  • 5664

7-干货! QT -实现使用拖放打开文件,以及打开可拖动的图片

实现一个拖动打开图片,并可以在窗口内任何移动图片的应用程序。 实现上述程序,首先需要分开三个部分来完成。第一个部分是界面创建,第二个部分是实现拖动打开文件功能,第三个部分是在窗口内移动图片功能。   ...
  • a3631568
  • a3631568
  • 2016年12月22日 21:07
  • 2124

Qt浅谈之十二:拖拽文字图片

首先选择窗体显示风格,接着显现拖拽效果,文字和图标都可以作为拖拽的对象,在窗体中的文字图标可以拖拽到窗口的任意位置,它们在两个独立运行的程序间也可相互拖拽(此时是复制一份到拖拽目的程序窗口中),文字拖...
  • taiyang1987912
  • taiyang1987912
  • 2014年07月01日 11:44
  • 6559

Qt 显示图片 放大 缩小 移动

本文章原创于www.yafeilinux.com 转载请注明出处。 1)显示图片: 将dialog.cpp文件中的paintEvent()函数更改如下。 void Dialo...
  • hobertony_7
  • hobertony_7
  • 2014年12月22日 11:59
  • 3047

Qt学习之路之鼠标事件

鼠标事件包括移动,鼠标按下,释放(松开),单击,双击....... 要自定义鼠标事件,需重写虚函数: void QWidget::mousePressEvent(QMouseEvent * even...
  • HK_5788
  • HK_5788
  • 2015年01月08日 20:38
  • 12309
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Qt 实现在窗口内拖动图片
举报原因:
原因补充:

(最多只允许输入30个字)