QT开发中文网

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

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

示例代码

#include <QApplication>
#include <QWidget>
#include <QPainter>
#include <QTouchEvent>

class ImageViewer : public QWidget {
    Q_OBJECT

public:
    ImageViewer(QWidget *parent = nullptr) : QWidget(parent), offsetX(0), offsetY(0) {
        // 启用触摸事件
        setAttribute(Qt::WA_AcceptTouchEvents);
        // 设置大图片路径
        image.load("path/to/your/large_image.jpg");
    }

protected:
    void paintEvent(QPaintEvent *event) override {
        Q_UNUSED(event);
        QPainter painter(this);
        
        // 绘制图片,考虑到偏移量
        painter.drawImage(offsetX, offsetY, image);
    }

    bool event(QEvent *event) override {
        if (event->type() == QEvent::TouchBegin || event->type() == QEvent::TouchUpdate) {
            QTouchEvent *touchEvent = static_cast<QTouchEvent *>(event);
            handleTouch(touchEvent);
            return true;  // 表示事件被处理
        }
        return QWidget::event(event);  // 其他事件交给基类处理
    }

private:
    void handleTouch(QTouchEvent *event) {
        const QList<QTouchEvent::TouchPoint> &touchPoints = event->touchPoints();

        for (const auto &point : touchPoints) {
            if (point.state() == Qt::TouchPointMoved) {
                QPointF delta = point.pos() - point.lastPos();
                offsetX += delta.x();
                offsetY += delta.y();
            }
        }
        
        update();  // 请求重绘窗口以更新显示
    }

private:
    QImage image;
    qreal offsetX;
    qreal offsetY;
};

int main(int argc, char *argv[]) {
    QApplication app(argc, argv);

    ImageViewer viewer;
    viewer.resize(800, 600); // 设置视图大小
    viewer.show();

    return app.exec();
}

代码说明

  1. 初始化和设置

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

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

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

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

注意事项

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


    内容由零声教学AI助手提供,问题来源于学员提问
目录导航
  • 示例代码
  • 代码说明
  • 注意事项
  • 本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
    转载请注明出处:https://qt.0voice.com/?id=12714

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

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

    联系我们

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

    微信号:3007537140

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

    关注我们
    x

    注册

    已经有帐号?