qt鼠标悬停图片放大_20.QT-Qpixmap实现图片鼠标缩放,鼠标拖动示例(详解)
时间: 2024-01-24 13:17:25 浏览: 200
在Qt中,可以使用QPixmap来显示图片。要实现图片鼠标缩放和鼠标拖动,可以使用以下步骤:
1. 创建一个QGraphicsView对象,并将其设置为可交互的。
2. 在QGraphicsView中创建一个QGraphicsScene对象,并将其设置为QGraphicsView的场景。
3. 在QGraphicsScene中创建一个QGraphicsPixmapItem对象,并将其设置为QGraphicsScene的项。
4. 加载需要显示的图片并设置到QGraphicsPixmapItem中。
5. 实现鼠标滚轮事件,通过增加或减少QGraphicsPixmapItem的缩放因子来实现图片缩放。
6. 实现鼠标按下和拖动事件,通过改变QGraphicsPixmapItem的位置来实现图片拖动。
下面是具体的代码实现示例:
```cpp
#include <QApplication>
#include <QGraphicsScene>
#include <QGraphicsView>
#include <QGraphicsPixmapItem>
#include <QPixmap>
#include <QWheelEvent>
#include <QPointF>
#include <QMouseEvent>
class ImageView : public QGraphicsView
{
public:
ImageView(QWidget *parent = nullptr)
: QGraphicsView(parent)
{
setInteractive(true); // 设置为可交互的
setDragMode(QGraphicsView::ScrollHandDrag); // 设置拖动模式为滚动拖动
m_pixmapItem = new QGraphicsPixmapItem;
m_scene = new QGraphicsScene(this);
m_scene->addItem(m_pixmapItem);
setScene(m_scene);
}
void setPixmap(const QPixmap &pixmap)
{
m_pixmapItem->setPixmap(pixmap); // 设置显示的图片
setSceneRect(pixmap.rect()); // 设置场景大小为图片大小
}
protected:
void wheelEvent(QWheelEvent *event) override
{
const QPointF posSceneBefore = mapToScene(event->pos()); // 获取事件发生位置在场景中的位置
const qreal factor = (event->angleDelta().y() > 0) ? 1.1 : 0.9; // 根据鼠标滚轮滚动方向计算缩放因子
m_pixmapItem->setScale(m_pixmapItem->scale() * factor); // 缩放图片
const QPointF posSceneAfter = mapToScene(event->pos()); // 获取事件发生位置在场景中的位置
const QPointF posSceneDelta = posSceneAfter - posSceneBefore; // 计算场景位置的变化
centerOn(mapToScene(viewport()->rect().center()) - posSceneDelta); // 保持鼠标位置不变,调整视图中心
}
void mousePressEvent(QMouseEvent *event) override
{
if (event->button() == Qt::LeftButton)
{
m_lastPos = event->pos(); // 记录鼠标按下的位置
}
QGraphicsView::mousePressEvent(event);
}
void mouseMoveEvent(QMouseEvent *event) override
{
if (event->buttons() & Qt::LeftButton)
{
const QPointF posSceneDelta = mapToScene(event->pos()) - mapToScene(m_lastPos); // 计算场景位置的变化
centerOn(mapToScene(viewport()->rect().center()) - posSceneDelta); // 调整视图中心
m_lastPos = event->pos(); // 记录当前位置,供下次计算使用
}
QGraphicsView::mouseMoveEvent(event);
}
private:
QGraphicsPixmapItem *m_pixmapItem;
QGraphicsScene *m_scene;
QPoint m_lastPos;
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
ImageView view;
QPixmap pixmap(":/images/image.jpg");
view.setPixmap(pixmap);
view.show();
return a.exec();
}
```
在这个示例中,我们创建了一个ImageView类继承自QGraphicsView。在构造函数中,我们设置了一些初始属性,创建了一个QGraphicsPixmapItem对象和一个QGraphicsScene对象,并将QGraphicsPixmapItem添加到QGraphicsScene中。在setPixmap函数中,我们加载了一张图片,并设置到QGraphicsPixmapItem中。
在wheelEvent函数中,我们根据鼠标滚轮的滚动方向计算缩放因子,并使用setScale函数改变QGraphicsPixmapItem的缩放因子。然后,我们计算视图中心在场景中的位置的变化,并使用centerOn函数调整视图中心,使鼠标位置保持不变。
在mousePressEvent函数和mouseMoveEvent函数中,我们记录了鼠标按下和移动的位置,并根据位置的变化使用centerOn函数调整视图中心,使图片实现拖动效果。
综上所述,通过这种方式,就可以实现图片鼠标缩放和鼠标拖动的效果了。
阅读全文