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 显示图片 放大 缩小 移动

本文章原创于www.yafeilinux.com 转载请注明出处。 1)显示图片: 将dialog.cpp文件中的paintEvent()函数更改如下。 void Dialo...

Qt:拖拽图片到QLabel上并显示

转载自:http://www.cppblog.com/biao/archive/2011/10/23/158940.html 仅供参考! 实现代码: #include "mainwindow.h...

详解QT下拖动操作Drag-Drop的实现

QT下实现Drag-Drop是极其容易的,一般看其文档即可看懂。下面给大家介绍一下。 所谓拖动,自动有一个源窗口,一个目标窗口,不过有时候源窗口与目的窗口是同一个窗口。 源窗口 在鼠标Press的时候...

qt中的拖拽及其使用技巧

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

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

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

Qt拖放 drag and drop

拖放提供一个应用程序之间传递信息的一种简单的可视化机制。拖放机制类似于剪切和粘贴机制。拖放操作同时被QT项目视图和图形视图框架支持。 QApplication提供了两个拖放相关的方法...

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

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

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

自己找的图片太大,在移动的时候不明显,懒得再找图片,所以用了QPainter将图片画在了label上 代码如下void Widget::paintEvent(QPaintEvent *) { ...

Qt之拖放

拖放是应用程序内或者应用程序之间数据传递的一种方式。通常是提供数据的复制和移动。拖放主要包括拖动和放下。有些窗口可能只需要提供拖动功能,有些窗口可能只需要放下,有些窗口可能两者功能都需要具备。

qt 实现label部件中的图片随鼠标移动

最近在做图片查看器,所以研究了一下这个东西! 首先给大家实现一下: 先在 .h 文件定义四个函数: void mousePressEvent(QMouseEvent *event); ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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