ZBLOG

QEvent::TouchUpdate 实现触屏移动paintEvent显示的大图片

要在Qt中使用 QEvent::TouchUpdate 来实现通过触摸移动在 paintEvent 中显示的大图片,你需要重写相关的事件处理函数。以下是一个简单的示例,演示了如何实现这个功能。

示例代码

  1. #include <QApplication>
  2. #include <QWidget>
  3. #include <QPainter>
  4. #include <QTouchEvent>
  5. class ImageViewer : public QWidget {
  6. Q_OBJECT
  7. public:
  8. ImageViewer(QWidget *parent = nullptr) : QWidget(parent), offsetX(0), offsetY(0) {
  9. // 启用触摸事件
  10. setAttribute(Qt::WA_AcceptTouchEvents);
  11. // 设置大图片路径
  12. image.load("path/to/your/large_image.jpg");
  13. }
  14. protected:
  15. void paintEvent(QPaintEvent *event) override {
  16. Q_UNUSED(event);
  17. QPainter painter(this);
  18. // 绘制图片,考虑到偏移量
  19. painter.drawImage(offsetX, offsetY, image);
  20. }
  21. bool event(QEvent *event) override {
  22. if (event->type() == QEvent::TouchBegin || event->type() == QEvent::TouchUpdate) {
  23. QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
  24. handleTouch(touchEvent);
  25. return true; // 表示事件被处理
  26. }
  27. return QWidget::event(event); // 其他事件交给基类处理
  28. }
  29. private:
  30. void handleTouch(QTouchEvent *event) {
  31. const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();
  32. for (const auto &point : touchPoints) {
  33. if (point.state() == Qt::TouchPointMoved) {
  34. QPointF delta = point.pos() - point.lastPos();
  35. offsetX += delta.x();
  36. offsetY += delta.y();
  37. }
  38. }
  39. update(); // 请求重绘窗口以更新显示
  40. }
  41. private:
  42. QImage image;
  43. qreal offsetX;
  44. qreal offsetY;
  45. };
  46. int main(int argc, char *argv[]) {
  47. QApplication app(argc, argv);
  48. ImageViewer viewer;
  49. viewer.resize(800, 600); // 设置视图大小
  50. viewer.show();
  51. return app.exec();
  52. }

代码说明

  1. 初始化和设置

    • 在构造函数中,我们启用了触摸事件并加载了一张大图片。
  2. 绘制图片

    • paintEvent() 方法中,我们使用 QPainter 将加载的图片绘制到指定的位置。位置由 offsetXoffsetY 控制,用于移动效果。
  3. 处理触摸事件

    • 重写 event() 方法,以便处理触摸开始 (QEvent::TouchBegin) 和更新 (QEvent::TouchUpdate) 的事件。
    • handleTouch() 函数中,我们计算当前触摸点和上一个位置之间的差异,然后更新偏移量(offsetX, offsetY)。
  4. 请求重绘

    • 调用 update() 方法来请求重新绘制窗口,从而反映出新的位置。

注意事项

  • 确保更换 "path/to/your/large_image.jpg" 为你自己的大图文件路径。
  • 如果你希望支持更多手势,比如缩放,可以进一步扩展此代码,通过增加对不同类型手势的支持来提升用户体验。


    内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=19238

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?