qt中的手势

【QT开发】手势处理 QGesture 类详解及实战应用 通过 QGesture 类,Qt 提供了一组强大且易于使用的接口,用于实现手势处理功能。合理应用 QGesture 提供的方法和信号槽机制,可以高效地完成多种手势的捕捉和处理任务。同时,通过自定义手势识别器、复杂手势处理及性能优化等高级技巧,能够进一步提升用户体验。 阅读详情

qt中的手势

手势在触屏中用的比较多。
前面写过一篇博客,讲了qt中的触屏事件是怎样的,不懂的,可以先看一些之前的文章,现在就是有些触屏事件怎么合成手势并调用的。

Qt 包含一个用于手势编程的框架,它能够通过一系列事件形成手势,而与所使用的输入方法无关。手势可以是鼠标的特定移动、触摸屏操作或其他来源的一系列事件。输入的性质、对手势的解释和采取的行动都由开发人员决定。

QGesture 类概述

QGesture 这个类是qt中提供的标准手势的基础类,提供所有手势通用信息的属性,这些属性还可扩展以提供额外的特定手势信息。常用的平移、捏合和轻扫手势由专门的子类QPanGesture QPinchGesture QSwipeGesture来实现,还有QTapAndHoldGesture,QTapGesture类。

标准手势的使用

可以为QWidget 和QGraphicsObject 子类的实例启用手势。接受手势输入的对象在整个文档中称为目标对象。

1.手势的启用

要为目标对象启用手势,请调用其QWidget::grabGesture() 或QGraphicsObject::grabGesture() 函数,并在参数中说明所需的手势类型。标准类型由Qt::GestureType 枚举定义,包括许多常用手势。

2.手势的识别之后事件处理

当用户执行手势时,QGestureEvent 事件将传递给目标对象,这些事件可通过重新实现部件的QWidget::event() 处理函数或图形对象的QGraphicsItem::sceneEvent() 来处理。
要在这两个函数中,用户可以对识别到的手势事件进行自己的事件触发和处理。

由于一个目标对象可以订阅不止一种手势类型,因此QGestureEvent 可以包含不止一个QGesture ,表示有几种可能的手势同时处于活动状态。这就需要小工具来决定如何处理这些多重手势,并选择是否取消其中一些手势,转而使用其他手势。

QGestureEvent 对象中包含的每个QGesture 都可以被单独接受或忽略,也可以一起被接受或忽略。此外,还可以使用多个获取器查询单个QGesture 数据对象状态。

3.手势事件标准处理过程

当QGesture 到达您的 widget 时,默认情况下会被接受。不过,好的做法是始终明确接受或拒绝一个手势。一般规则是,如果您接受一个手势,那么您就在使用它。如果忽略它,则表示对它不感兴趣。忽略一个手势可能意味着它被提供给另一个目标对象,或者被取消。

每个QGesture 都会经历几种状态;有一种明确定义的方法可以改变状态,通常用户输入是状态改变的原因(例如通过开始和停止交互),但小工具也可以导致状态改变。

当一个特定的QGesture 首次传送到一个部件或图形项目时,它将处于Qt::GestureStarted 状态。此时处理手势的方式会影响以后能否与之交互。

接受手势意味着 Widget 会对手势采取行动,随后将出现 Qt::GestureUpdatedstate 的手势。
忽略手势意味着手势将不再提供给你。手势也将提供给父部件或项目。
当手势处于开始状态并被接受时,调用 setGestureCancelPolicy() 会导致其他手势被取消。
使用QGesture::CancelAllInContext 取消手势会导致处于任何状态的所有手势被取消,除非它们被明确接受。这意味着子系统上的活动手势也会被取消。这也意味着,如果小部件忽略了在同一个QGestureEvent 中发送的手势,这些手势也会被取消。这也是一种有用的方法,可以过滤掉除你感兴趣的手势之外的所有手势。

简单点说,就是在多个手势都被触发的条件下,你可以选择自己所感兴趣的,其他的手势可以忽略掉或者通过 setGestureCancelPolicy()函数或者QGesture::CancelAllInContext 函数来取消已经触发的手势,只保留自己想要的。

4.对手势事件处理示例

为方便起见,图像手势示例重新实现了一般的event() 处理函数,并将手势事件委托给专门的 gestureEvent() 函数:

bool ImageWidget::event(QEvent *event)
{//判断是否是手势事件,如果是,就进入自己手势处理的函数gestureEvent(),
//是把前面说的手势事件QGestureEvent事件传递了过去
    if (event->type() == QEvent::Gesture)
        return gestureEvent(static_cast<QGestureEvent*>(event));
    return QWidget::event(event);
}

交付给目标对象的手势事件可以单独进行检查并适当处理:

bool ImageWidget::gestureEvent(QGestureEvent *event)
{
    qCDebug(lcExample) << "gestureEvent():" << event;
    //这里就直接就获取对应的手势就处理了,其实这里还可以对触发有冲突的事件进行屏蔽
	//QList<QGesture *> activeGestures() const 	获取活跃的手势
 	//QList<QGesture *> canceledGestures() const 获取关闭的手势	
 	//QGesture *gesture(Qt::GestureType type) const	获取所有触发的手势
 	//QList<QGesture *> gestures() const		获取对应的手势
 	//比如这里不给同时触发SwipeGesture和PanGesture手势,就可以通过gestures()判断数量,如果超过了一个,不处理等等逻辑
    if (QGesture *swipe = event->gesture(Qt::SwipeGesture))
        swipeTriggered(static_cast<QSwipeGesture *>(swipe));
    else if (QGesture *pan = event->gesture(Qt::PanGesture))
        panTriggered(static_cast<QPanGesture *>(pan));
    if (QGesture *pinch = event->gesture(Qt::PinchGesture))
        pinchTriggered(static_cast<QPinchGesture *>(pinch));
    return true;
}

响应手势只需获取QGestureEvent 发送给目标对象的QGesture 对象,并检查其中包含的信息即可。

void ImageWidget::swipeTriggered(QSwipeGesture *gesture)
{
	//这里是具体的手势的状态进行处理了,能够获取到手势里面的具体属性等信息在处理对应的逻辑
    if (gesture->state() == Qt::GestureFinished) {
        if (gesture->horizontalDirection() == QSwipeGesture::Left
            || gesture->verticalDirection() == QSwipeGesture::Up) {
            qCDebug(lcExample) << "swipeTriggered(): swipe to previous";
            goPrevImage();
        } else {
            qCDebug(lcExample) << "swipeTriggered(): swipe to next";
            goNextImage();
        }
        update();
    }
}

在这里,我们会检查用户滑动部件的方向,并相应地修改其内容。
可以通过这些步骤,对一个触屏事件触发的手势进行比较好的控制。

创建自己的手势识别器

添加对新手势的支持需要创建和注册一个新的手势识别器。根据手势的识别过程,可能还需要创建一个新的手势对象。

要创建一个新的识别器,需要子类化QGestureRecognizer 以创建一个自定义识别器类。其中有一个虚拟函数必须重新实现,另外两个可以根据需要重新实现。

过滤输入事件

必须重新实现recognize() 函数。该函数用于处理和过滤目标对象的输入事件,并确定它们是否与识别器正在寻找的手势相对应。

虽然手势识别的逻辑是在该函数中实现的,可能会使用基于Qt::GestureState 枚举的状态机,但您可以在所提供的QGesture 对象中存储有关识别过程状态的持久信息。

您的recognize() 函数必须返回一个QGestureRecognizer::Result 值,该值表示给定手势和目标对象的识别状态。这将决定是否向目标对象发送手势事件。

自定义手势

如果选择用自定义QGesture 子类来表示手势,则需要重新实现create() 函数,以构建手势类实例,而不是标准的QGesture 实例。或者,您也可以使用标准的QGesture 实例,但在其中添加额外的动态属性,以表达您想要处理的手势的具体细节。

重置手势

如果您使用的自定义手势对象在取消手势时需要重置或进行其他特殊处理,则需要重新实现reset() 函数来执行这些特殊任务。

请注意,QGesture 对象只针对目标对象和手势类型的每种组合创建一次,而且每次用户尝试在目标对象上执行相同的手势类型时,这些对象都可能被重复使用。因此,在每次尝试识别手势后,重新实现reset() 函数进行清理是非常有用的。

使用新的手势识别器
要使用手势识别器,请构建QGestureRecognizer 子类的实例,并通过QGestureRecognizer::registerRecognizer() 向应用程序注册。可以通过QGestureRecognizer::unregisterRecognizer() 删除特定类型手势的识别器。

自定义手势例子(画圆手势)

1. 创建自定义手势类cpp

// circlegesture.h
#include <QGesture>
#include <QPointF>

class CircleGesture : public QGesture {
    Q_OBJECT
public:
    explicit CircleGesture(QObject *parent = nullptr);

    QPointF center() const { return m_center; }
    qreal radius() const { return m_radius; }

private:
    friend class CircleGestureRecognizer;
    QPointF m_center;
    qreal m_radius = 0;
};

2. 实现手势识别器

h

// circlegesturerecognizer.h
#include <QGestureRecognizer>
#include <QVector>

class CircleGestureRecognizer : public QGestureRecognizer {
public:
    explicit CircleGestureRecognizer();

private:
    QGesture* create(QObject* target) override;
    Result recognize(QGesture* state, QObject* watched, QEvent* event) override;
    void reset(QGesture* state) override;

    // 圆检测算法
    bool isCircle(const QVector<QPointF>& points, QPointF& center, qreal& radius);
};

cpp

// circlegesturerecognizer.cpp
#include "circlegesturerecognizer.h"
#include "circlegesture.h"
#include <QMouseEvent>
#include <QDebug>
#include <cmath>

CircleGestureRecognizer::CircleGestureRecognizer() 
    : QGestureRecognizer() {}

QGesture* CircleGestureRecognizer::create(QObject* target) {
    return new CircleGesture(target);
}

QGestureRecognizer::Result CircleGestureRecognizer::recognize(
    QGesture* state, QObject*, QEvent* event)
{
    CircleGesture* gesture = static_cast<CircleGesture*>(state);

    static QVector<QPointF> points;
    static QPointF startPos;

    QTouchEvent* touchEvent = dynamic_cast<QTouchEvent*>(event);
    if (touchEvent) {
        // 处理触摸点
        const QTouchEvent::TouchPoint& tp = touchEvent->touchPoints().first();
        switch (event->type()) {
        case QEvent::TouchBegin:
            // 类似MouseButtonPress
        case QEvent::TouchUpdate:
            // 类似MouseMove
        case QEvent::TouchEnd:
            // 类似MouseButtonRelease
        }
    }
    else if{ // 鼠标处理...
    const QMouseEvent* mouseEvent = static_cast<const QMouseEvent*>(event);

    switch (event->type()) {
    case QEvent::MouseButtonPress:
        points.clear();
        startPos = mouseEvent->pos();
        points.append(startPos);
        return MayBeGesture;
    
    case QEvent::MouseMove:
        if (points.isEmpty()) return Ignore;
        points.append(mouseEvent->pos());
        return MayBeGesture;
    
    case QEvent::MouseButtonRelease: {
        if (points.size() < 10) { // 最少需要10个点
            return CancelGesture;
        }

        QPointF center;
        qreal radius;
        if (isCircle(points, center, radius)) {
            gesture->m_center = center;
            gesture->m_radius = radius;
            points.clear();
            return FinishGesture;
        }
        return CancelGesture;
    }
    
    default:
        break;
    }
    }
    return Ignore;
}

void CircleGestureRecognizer::reset(QGesture* state) {
    CircleGesture* gesture = static_cast<CircleGesture*>(state);
    gesture->m_radius = 0;
    QGestureRecognizer::reset(state);
}

// 核心检测算法
bool CircleGestureRecognizer::isCircle(
    const QVector<QPointF>& points, 
    QPointF& center, 
    qreal& radius) 
{
    // 1. 计算中心点(所有点的平均值)
    qreal sumX = 0, sumY = 0;
    for (const QPointF& p : points) {
        sumX += p.x();
        sumY += p.y();
    }
    center = QPointF(sumX / points.size(), sumY / points.size());

    // 2. 计算平均半径
    qreal totalDist = 0;
    for (const QPointF& p : points) {
        totalDist += std::hypot(p.x() - center.x(), p.y() - center.y());
    }
    radius = totalDist / points.size();

    // 3. 计算标准差(判断离散程度)
    qreal variance = 0;
    for (const QPointF& p : points) {
        qreal dist = std::hypot(p.x() - center.x(), p.y() - center.y());
        variance += std::pow(dist - radius, 2);
    }
    qreal stdDev = std::sqrt(variance / points.size());

    // 4. 判断圆形度(标准差 < 半径的15%)
    if (stdDev > radius * 0.15) {
        return false;
    }

    // 5. 检查角度覆盖(至少270度)
    QVector<qreal> angles;
    for (const QPointF& p : points) {
        qreal angle = std::atan2(p.y() - center.y(), p.x() - center.x());
        angles.append(angle);
    }
    
    std::sort(angles.begin(), angles.end());
    qreal maxGap = 0;
    for (int i = 1; i < angles.size(); ++i) {
        maxGap = qMax(maxGap, angles[i] - angles[i-1]);
    }
    // 检查首尾间隙
    maxGap = qMax(maxGap, angles.front() + 2*M_PI - angles.back());

    // 最大间隙应小于90度(π/2)
    return maxGap < M_PI_2;
}
  1. 在窗口中使用手势cpp
// mainwindow.h
#include <QMainWindow>
#include "circlegesture.h"

class MainWindow : public QMainWindow {
    Q_OBJECT
public:
    MainWindow(QWidget* parent = nullptr);

protected:
    bool event(QEvent* event) override;

private:
    Qt::GestureType circleType;
};

cpp

// mainwindow.cpp
#include "mainwindow.h"
#include "circlegesturerecognizer.h"

MainWindow::MainWindow(QWidget* parent)
    : QMainWindow(parent)
{
    // 注册手势
    CircleGestureRecognizer* recognizer = new CircleGestureRecognizer;
    circleType = QGestureRecognizer::registerRecognizer(recognizer);
    
    // 启用手势识别
    grabGesture(circleType);
}

bool MainWindow::event(QEvent* event) {
    if (event->type() == QEvent::Gesture) {
        QGestureEvent* gestureEvent = static_cast<QGestureEvent*>(event);
        if (CircleGesture* circle = static_cast<CircleGesture*>(
            gestureEvent->gesture(circleType))) 
        {
            if (circle->state() == Qt::GestureFinished) {
                qDebug() << "Circle detected! Center:" << circle->center()
                         << "Radius:" << circle->radius();
                return true;
            }
        }
    }
    return QMainWindow::event(event);
}

注意点:

QGestureManager::deliverEvent: could not find the target for gesture错误
是调用了circle->setHotSpot(mouseEvent->pos());设置了热点,但是要是全局坐标才行,否则就会出现这个错误。热点需要屏幕全局坐标,而pos()是窗口局部坐标。
QScrollArea等有些类默认注册了QPanGesture手势
在 Qt 中,QScrollArea(以及其基类QAbstractScrollArea)的底层实现确实默认支持并处理QPanGesture手势,这是为了在触摸设备上提供自然的滑动滚动体验(类似手机上滑动页面的交互)。QAbstractScrollArea这个类是默认注册了QPanGesture手势的,他的子类QAbstractItemView, QGraphicsView, QMdiArea, QPlainTextEdit, QScrollArea, and QTextEdit 都是具备双指滑动的。

Qt Quick 手势

没有通用的全局手势识别器;各个组件可以以各自的方式响应触摸事件。例如,PinchArea 处理双指手势,Flickable 用于单指滑动内容,而 MultiPointTouchArea 可以处理任意数量的触摸点,并允许应用程序开发人员编写自定义的手势识别代码。

详解Qt 之QSwipeGesture手势滑动 在现代触摸屏设备上,手势识别技术为用户提供了更加直观和便捷的交互方式。在 Qt 中,是一个用于表示“滑动手势”的类,它允许开发者处理用户在触摸屏或触控板上的滑动操作。是 Qt 手势识别系统的一部分,旨在提供一种简单而高效的方式来响应触摸或手势操作,常用于移动设备、平板电脑和支持触控的桌面应用中。本文将介绍类的作用、功能、常用方法及应用场景,帮助开发者理解并在 Qt 应用中实现滑动手势识别。是 Qt 中用于表示滑动手势的类,它允许开发者在触摸屏或触控板上识别和处理滑动操作。 阅读详情

相关推荐

Qt 自定义手势

Qt 自定义 手势 QGesture

u013925007的博客 2372

基于QT的手势识别系统:实现石头剪刀布动作识别

QT是一个跨平台的C++应用程序框架,广泛应用于开发图形用户界面应用程序及跨平台的应用程序。它提供了一系列工具和库,包括用于2D/3D图形、数据库、网络、多线程以及模块化应用程序开发的强大功能。手势识别系统作为一种直观的交互方式,已经在多个领域得到了广泛的应用。了解手势识别系统,首先需要掌握手势识别技术的发展历程和当前的应用现状。QGestureRecognizer 是 Qt 框架中用于自定义手势识别器的类。它为开发人员提供了强大的工具,使得开发手势驱动的应用程序成为可能。类的核心方法包括和。

weixin_29009401的博客 848

Qt实现手势缩放和平移(QGestureEvent)

qt手势事件处理

fhakfs的博客 4355

基于Qt 的手势识别案例

前后背景采用Ostu算法分离,得到二值图像后得到轮廓,多边形拟合之后,再得到凸包和凹陷,凹陷根据起始点,结束点,凹陷点三个点外积确定手指个数,若是基于Qt opencv环境不会搭建,可以参考我的博客,可留言 http://blog.youkuaiyun.com/a1294246096/article/details/17149635

Qt实现多点触控与手势识别

Qt实现多点触控与手势识别

Qt手势框架综合分析:架构、实现及其在 Widgets 和 Graphics View 中的高级应用

Qt手势框架采用解耦的、状态驱动的设计,将原始输入事件转换为抽象手势。核心架构包括三个关键组件:QGesture(手势抽象表示)、QGestureEvent(手势传递机制)和QGestureRecognizer(手势识别引擎)。框架通过状态机(GestureStarted/Updated/Finished/Canceled)管理手势生命周期,并支持QWidget和QGraphicsObject两种实现方式。标准手势如QPanGesture和QPinchGesture分别处理平移、缩放和旋转操作,通过delt

greenspan的专栏 763

实战指南(一)SCAPS-1D太阳能电池模拟软件从零到一:模型构建与参数解析

本文详细介绍了SCAPS-1D太阳能电池模拟软件的使用方法,从模型构建到参数解析,帮助用户快速掌握这一免费且功能强大的工具。特别适合用于单结/多结电池的电学性能分析,涵盖钙钛矿电池等常见结构的模拟实践,并提供参数调试和收敛性问题处理的实用技巧。

weixin_30588675的博客 445

Qt Quick 触摸与手势识别

width: 400// 手势轨迹Path {// 手势识别器maximumTouchPoints: 1 // 单指手势// 记录起始点// 重置路径// 更新路径// 清除// 延迟清除路径// 手势识别逻辑// 计算移动距离// 只有移动足够距离才识别为手势// 计算角度// 判断方向showGestureInfo("向右滑动")showGestureInfo("向下滑动")showGestureInfo("向左滑动")} else {

编程与实战的博客 575

计量经济学——事件研究法/事件分析法

计量经济学——事件研究法/事件分析法

weixin_46189461的博客 6752

iPhone免越狱Git服务器搭建教程-iSH

iPhone免越狱Git服务器搭建教程

jts666的博客 4427

Qt/C++:QScroller让界面滑动起来

QScroller支持鼠标和触摸屏拖拽滑动手势,很好的实现丝滑动画效果。用起来也非常简单.

MeeFly的博客 4926

Bootloader详解,理解Bootloader看这篇就够了

这里写目录标题一、Bootloader作用(目的)二、完成Boot最终目的的前提条件三、对前提条件的详细说明3.1、对前提条件(1)的说明:3.2、对前提条件(2)的说明:3.3、对前提条件(3)的说明:3.4、对前提条件(4)的说明:3.4、对前提条件(5)的说明:四、loader是干啥的 一、Bootloader作用(目的) Bootloader=Boot + loader Boot的目的: 最终目的:跳到C语言中;为了C语言运行程序会进行一系列的初始化,系统一上电后如何通过一系列的设置让软件程序员

iduuigdg的博客 11万+

QPanGesture Class

Header:#include < QPanGesture > qmake:QT += widgets Since:Qt 4.6 Inherits:QGesture This class was introduced in Qt 4.6.

weixin_43446462的博客 359

淘宝母婴用品数据挖掘及可视化分析研究

1. 背景介绍 在当今的电子商务时代,母婴用品市场已经成为了各大电商平台的一片蓝海。淘宝作为中国最大的电子商务平台,其上的母婴用品交易数据自然引人关注。理解这些数据,可以帮助商家更好地制定营销策略,也可以帮助消费者更好地选择产品。因此,本文将对淘宝母婴用品的数据进行深入的挖掘和分析。 1.1 电子商务的

AI天才研究院 1257

基于STM32、HAL库的MCP4013T-103E/CH 数字电位器驱动程序设计

define MCP4013_I2C_ADDR (0x5F << 1) // HAL库使用7位地址左移1位,或直接使用0xBE/0xBF。#include "i2c.h" // 包含你的I2C初始化相关的头文件,例如由CubeMX生成的 i2c.h。大于127的值会被截断。// MCP4013的读操作:主机发起读取请求,从机返回当前滑片位置的一个字节。// 使用HAL_I2C_Master_Transmit直接发送数据。// 使用HAL_I2C_Master_Receive读取一个字节。

corlin6688的博客 126

NodeGui 手势事件详解:NativeGestureType 枚举与 QNativeGestureEvent 事件处理实战

在 NodeGui 中处理触控板与触摸屏上的原生手势(平移、缩放、旋转、轻扫等),核心是围绕 `NativeGestureType` 这个枚举展开的:它是 `QNativeGestureEvent` 的 `gestureType()` 返回值的取值空间,也是你在事件回调中区分"平台原生手势处于哪个阶段、是哪种交互类型"的唯一依据。读完本文,你将完整掌握 `NativeGestureType` 的

gitblog_00294的博客 156

使用 MATLAB/Simulink 对基于同步发电机的双机系统进行建模

双机系统(Two-Machine System)是电力系统中用于研究动态稳定性和控制策略的一个典型模型。它由两台同步发电机通过输电网络相互连接,模拟实际电网中的互联操作。当发生短路故障时,系统的暂态稳定性会受到挑战,可能导致发电机失步或电压崩溃。本教程将带你使用 MATLAB/Simulink 对基于同步发电机的双机系统进行建模,并对其在短路故障条件下的暂态稳定性进行仿真和分析。

amy_mhd的博客 216

NodeGui 手势标志枚举 GestureFlag 详解:值含义、位组合与仓库现状

本文以 NodeGui 官方 API 文档中生成的 `GestureFlag` 枚举文档为核心,系统讲解该枚举三个成员——`DontStartGestureOnChildren`、`ReceivePartialGestures`、`IgnoredGesturesPropagateToParent` 的语义、数值设计(1/2/4 的位标志组合规律)以及在 Qt 手势框架中的实际作用。同时结合本仓库源

gitblog_00297的博客 246

基于STM32的智能血氧、心率、体温、血压监测系统

摘要:本文设计了一款基于STM32F103C8T6的多功能健康监测系统,可实时检测血氧、心率、体温和血压四项生理参数。系统集成MAX30102、DS18B20等传感器模块,采用OLED显示和蓝牙无线传输技术,实现一键血压测量、阈值报警及手机APP数据管理功能。硬件设计包含传感器采集、电源管理、显示报警等模块;软件采用模块化架构,实现数据采集处理、蓝牙通讯等功能。测试表明系统测量准确可靠,为家庭健康监测提供了便携解决方案。未来可扩展更多监测参数和智能分析功能。

3254968421的博客 770

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Ubuntu禁用系统手势,阻止应用程序异常最小化

本文介绍了如何禁用Ubuntu系统手势以避免QT应用在全屏时被误触最小化。首先需要安装gnome-shell-extensions及相关依赖包,然后从官网下载Disable Gestures插件并解压到指定目录。通过修改metadata.json文件中的uuid并重启系统后,在扩展中启用该插件即可成功禁用手势功能。该方法有效解决了触摸屏设备上单指下滑误触导致应用退出的问题。

QAZ600888的博客 550

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

用Qt打造智能相册:自动记忆路径+缩略图预览+手势缩放(附完整源码)

本文详细介绍了如何利用Qt框架构建高性能智能相册系统,涵盖自动记忆路径、缩略图预览和手势缩放等核心功能。通过Qt的跨平台特性和丰富的图形处理能力,开发者可以快速实现高效的图片管理和交互体验,适用于各类图片浏览应用场景。

yellow的专栏 665

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Qt收藏

1.Qt Kinetic scrolling - from idea to implementation http://developer.nokia.com/Community/Wiki/Qt_Kinetic_scrolling_-_from_idea_to_implementation 2013-08-14 2.Custom Swipe Gestures in Qt http:/...

weixin_30561177的博客 83

QScroller怎么使用

QScroller是一个Qt的类,可以帮助你提供手势驱动的内容滚动功能。你可以使用QScroller对象来控制一个滚动区域,并提供一些手势来滚动内容,例如拖动、滑动或缩放。 要使用QScroller,你需要先构建一个QScroller对象,然后调用setWidget()方法将其关联到一个滚动区域,例如QScrollArea、QListView或QGraphicsView。然后你就可以使用QScro...

weixin_35751412的博客 566

AI智能棋盘利用Atmel AT42QT2120构建QTouch滑动界面

本文介绍基于AT42QT2120芯片的QTouch滑动交互设计在AI智能棋盘中的应用,涵盖硬件架构、电容感应原理、代码实现、交互逻辑及工程优化,展现低功耗、高可靠性的人机交互解决方案。

weixin_34392511的博客 789

QPinchGesture Class

Header:#include < QPinchGesture > qmake:QT += widgets Since:Qt 4.6 Inherits:QGesture This class was introduced in Qt 4.6.

weixin_43446462的博客 288
上一篇: Qt3d中的材质--PBR材质
下一篇: qt贝塞尔曲线演示工具
Simple_core
博客等级 码龄6年 929粉丝 93原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值