Qt鼠标拖动ScrollArea代替鼠标滚轮操作

来源:互联网 发布:淘宝申请介入问题描述 编辑:程序博客网 时间:2024/05/16 17:11

    因为此前有个项目做的软件要在平板上运行,屏幕不大,滚动条太细,如果加粗滚动条影响美观,滚动条太细又点不到,用户体验较差。所以做了这个鼠标拖动即可代替鼠标滚轮的功能。


dialogex.h


#ifndef DIALOGEX_H#define DIALOGEX_H#include <QDialog>#include <QScrollArea>#include <QScrollBar>#include <QLabel>#include <QMouseEvent>class DialogEx : public QDialog{    Q_OBJECTpublic:    DialogEx(QWidget *parent = 0);    ~DialogEx();    void init();    QScrollArea*    m_pScrollArea;    QWidget*        m_pScrollWidget;    QLabel*         m_pTipLabel;    bool            m_bMousePressed;    QPoint          m_PressPosition;protected:    void mouseMoveEvent(QMouseEvent *e) Q_DECL_OVERRIDE;    void mousePressEvent(QMouseEvent *e) Q_DECL_OVERRIDE;    void mouseReleaseEvent(QMouseEvent *e) Q_DECL_OVERRIDE;};#endif // DIALOGEX_H


dialogex.cpp


#include "dialogex.h"DialogEx::DialogEx(QWidget *parent)    : QDialog(parent)    , m_pScrollArea(NULL)    , m_pScrollWidget(NULL)    , m_pTipLabel(NULL)    , m_bMousePressed(false){    init();}DialogEx::~DialogEx(){}void DialogEx::init(){    this->setFixedSize(300, 200);    m_pScrollArea = new QScrollArea(this);    m_pScrollWidget = new QWidget(m_pScrollArea);    m_pTipLabel = new QLabel("证明我移动了", m_pScrollWidget);    m_pScrollArea->setFixedSize(this->width(), this->height());    m_pScrollWidget->setFixedSize(this->width(), this->height() * 2);    m_pTipLabel->adjustSize();    m_pScrollArea->setWidget(m_pScrollWidget);    m_pScrollArea->setAlignment(Qt::AlignCenter);    m_pScrollArea->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);    m_pScrollArea->move(0, 0);    m_pScrollWidget->move(0, 0);    m_pTipLabel->move(100, 100);}void DialogEx::mouseMoveEvent(QMouseEvent *e){    if (!m_bMousePressed)    {        return;    }    QPoint currentPt = e->pos();    int dist = m_PressPosition.y() - currentPt.y();    m_pScrollArea->verticalScrollBar()->setValue(m_pScrollArea->verticalScrollBar()->value() + dist);    m_PressPosition = currentPt;}void DialogEx::mousePressEvent(QMouseEvent *e){    m_bMousePressed = true;    m_PressPosition = e->pos();}void DialogEx::mouseReleaseEvent(QMouseEvent *e){    Q_UNUSED(e);    m_bMousePressed = false;    m_PressPosition.setX(0);    m_PressPosition.setY(0);}

main.cpp

#include "dialogex.h"#include <QApplication>int main(int argc, char *argv[]){    QApplication a(argc, argv);    DialogEx w;    w.show();    return a.exec();}


例子中只做了竖直方向的拖动,水平方向同理


原创粉丝点击