ScrollArea支持鼠標拖動

        創建自定義類,實現在滾動區域內拖動鼠標顯示滾動條,否則不顯示滾動條。

        頭文件

#ifndef MYSCROLLAREA_H
#define MYSCROLLAREA_H

#include <QObject>
#include <QScrollArea>
#include <QPoint>

class MyScrollArea : public QScrollArea
{
    Q_OBJECT

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

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

private:
    bool mMoveStart;
    bool mContinuousMove;
    QPoint mMousePoint;
};

#endif // MYSCROLLAREA_H
        源文件

#include "myscrollarea.h"
#include <QMouseEvent>
#include <QScrollBar>

MyScrollArea::MyScrollArea(QWidget *parent)
    :QScrollArea(parent)     //基類
    ,mMoveStart(false)
    ,mContinuousMove(false)
    ,mMousePoint(QPoint(0,0))
{
    installEventFilter(this);
}

MyScrollArea::~MyScrollArea()
{
}

bool MyScrollArea::eventFilter(QObject *obj, QEvent *evt)
{
    if(evt->type() == QEvent::MouseMove)
    {
        QMouseEvent *me = (QMouseEvent*) evt;
        if(me->buttons() & Qt::LeftButton)
        {
            if(!mMoveStart)
            {
//                if(me->pos().y() < (horizontalScrollBar()->pos().y() + horizontalScrollBar()->height())
//                        || me->pos().x() < (verticalScrollBar()->pos().x() + verticalScrollBar()->width()) )
//                    return false;

                mMoveStart = true;
                mContinuousMove = false;
                mMousePoint = me->globalPos();
            }
            else
            {
                setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOn);//開啓滾動條
                setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOn);

                QScrollBar *scrollBarx = horizontalScrollBar();
                QScrollBar *scrollBary = verticalScrollBar();

                QPoint p = me->globalPos();
                int offsetx = p.x() - mMousePoint.x();
                int offsety = p.y() - mMousePoint.y();
                if(!mContinuousMove && (offsetx > -10 && offsetx < 10) && (offsety > -10 && offsety < 10))
                    return false;

                mContinuousMove = true;

                scrollBarx->setValue(scrollBarx->value() - offsetx);
                scrollBary->setValue(scrollBary->value() - offsety);
                mMousePoint = p;
            }
            return true;
        }
    }
    else if(evt->type() == QEvent::MouseButtonRelease)
    {
        mMoveStart = false;
        setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);//關閉滾動條
        setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
    }
    return QObject::eventFilter(obj,evt);
}



發佈了57 篇原創文章 · 獲贊 24 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章