osgQt支持触摸屏

1. osgQt的构造函数添加:setAttribute(Qt::WA_AcceptTouchEvents);//wyh

2. event()修改,支持触摸时间

bool GLWidget::event( QEvent* event )
{

    // QEvent::Hide
    //
    // workaround "Qt-workaround" that does glFinish before hiding the widget
    // (the Qt workaround was seen at least in Qt 4.6.3 and 4.7.0)
    //
    // Qt makes the context current, performs glFinish, and releases the context.
    // This makes the problem in OSG multithreaded environment as the context
    // is active in another thread, thus it can not be made current for the purpose
    // of glFinish in this thread.

    // QEvent::ParentChange
    //
    // Reparenting GLWidget may create a new underlying window and a new GL context.
    // Qt will then call doneCurrent on the GL context about to be deleted. The thread
    // where old GL context was current has no longer current context to render to and
    // we cannot make new GL context current in this thread.

    // We workaround above problems by deferring execution of problematic event requests.
    // These events has to be enqueue and executed later in a main GUI thread (GUI operations
    // outside the main thread are not allowed) just before makeCurrent is called from the
    // right thread. The good place for doing that is right after swap in a swapBuffersImplementation.

    if (event->type() == QEvent::Hide)
    {
        // enqueue only the last of QEvent::Hide and QEvent::Show
        enqueueDeferredEvent(QEvent::Hide, QEvent::Show);
        return true;
    }
    else if (event->type() == QEvent::Show)
    {
        // enqueue only the last of QEvent::Show or QEvent::Hide
        enqueueDeferredEvent(QEvent::Show, QEvent::Hide);
        return true;
    }
    else if (event->type() == QEvent::ParentChange)
    {
        // enqueue only the last QEvent::ParentChange
        enqueueDeferredEvent(QEvent::ParentChange);
        return true;
    }
    //wyh
    else if(event->type() == QEvent::TouchBegin ||event->type() == QEvent::TouchUpdate || event->type() == QEvent::TouchEnd)
    {
        QList<QTouchEvent::TouchPoint> touchPoints = static_cast<QTouchEvent *>(event)->touchPoints();
        if(touchPoints.count() >= 2)
        {
            //test
            //std::cout << "touch multiViewer" << std::endl;
            //std::cout << std::endl;

            osg::ref_ptr<osgGA::GUIEventAdapter> osg_event(NULL);
            foreach (const QTouchEvent::TouchPoint &touchPoint, touchPoints)
            {
                QPointF touchPos = touchPoint.pos();

                ////test
                //std::cout << "x:" << touchPos.x() << "\t" << "y:" << touchPos.y() << "\t";

                if(touchPoint.state() == Qt::TouchPointPressed)
                {
                    if (!osg_event) {
                        osg_event =  _gw->getEventQueue()->touchBegan( touchPoint.id(), osgGA::GUIEventAdapter::TOUCH_BEGAN, touchPos.x()  , touchPos.y());
                    } else {
                        osg_event->addTouchPoint( touchPoint.id(), osgGA::GUIEventAdapter::TOUCH_BEGAN, touchPos.x() , touchPos.y());
                    }
                }
                else if(touchPoint.state() == Qt::TouchPointMoved)
                {
                    if (!osg_event) {
                        osg_event =  _gw->getEventQueue()->touchMoved( touchPoint.id(), osgGA::GUIEventAdapter::TOUCH_MOVED, touchPos.x(), touchPos.y());
                    } else {
                        osg_event->addTouchPoint( touchPoint.id(), osgGA::GUIEventAdapter::TOUCH_MOVED, touchPos.x() , touchPos.y());
                    }
                }
                else if(touchPoint.state() == Qt::TouchPointReleased)
                {
                    // No double tap detection with RAW TOUCH Events, sorry.
                    if (!osg_event) {
                        osg_event =  _gw->getEventQueue()->touchEnded( touchPoint.id(), osgGA::GUIEventAdapter::TOUCH_ENDED, touchPos.x(), touchPos.y(), 1);
                    } else {
                        osg_event->addTouchPoint( touchPoint.id(), osgGA::GUIEventAdapter::TOUCH_ENDED, touchPos.x() , touchPos.y());
                    }
                }
            }
            return true;
        }

    }

    // perform regular event handling
    return QGLWidget::event( event );
}
时间: 2024-10-02 22:13:32

osgQt支持触摸屏的相关文章

jQuery支持触摸屏设备的响应式幻灯片插件

这是一款效果非常好的支持移动触摸设备的响应式模块化jQuery幻灯片插件.通过这个幻灯片插件你可以制作出漂亮和专业的幻灯片效果.它的特点有: 模块化的体系结构. 响应式设计. 支持触摸滑动. 支持CSS3过渡效果. 支持动画层. 幻灯片可以无限循环. 支持旋转木马布局. 支持全屏显示. 幻灯片带有缩略图. 支持深层链接. 图片带有懒加载模式. 支持视网膜设备. 支持淡入淡出效果. 导航按钮使用CSS生成,不使用图片,样式容易控制. 支持幻灯片中嵌人视频. 支持图片尺寸自适应(不同的图片会显示不同

Html5添加支持触摸屏的响应式轮播图插件教程

一.使用方法 <link rel="stylesheet" href="css/sangarSlider.css" type="text/css"> <link rel="stylesheet" href="css/sangar-skin-default.css" type="text/css"> <script type="text/javasc

转载: linux2.6.37.4内核在XC2440开发板上移植(六)之触摸屏驱动移植

来自:http://blog.chinaunix.net/uid-22030783-id-3023527.html 内核自带s3c2440的触摸屏控制器驱动,属于input子系统的驱动,触摸屏驱动需要ADC驱动的支持,触摸屏驱动文件为:drivers/input/touchscreen/s3c2410_ts.c 在mach-xc2440.c文件中加入对触摸屏驱动的支持, 创建s3c2410_ts_mach_info平台数据 加入必要的头文件: #include <plat/ts.h> xc24

PLC无线通讯方案,支持西门子,三菱,欧姆龙,台达等各品牌PLC

在实际项目中,经常有多台PLC之间需要通讯,距离可能从几十米到几千米,也有的客户需要通过互联网来远距离监控PLC的状态. 在这里介绍一种PLC无线通讯的实现方法,采用巨控GRM200系列PLC专用无线通讯模块,支持通过PPI协议连接西门子S7200 PLC和通过MPI协议连接西门子S7300 /400 PLC, PLC侧都不需要编程,同时巨控PLC专用无线通讯模块还可直接支持的PLC包括三菱 PLC,,欧姆龙PLC,台达PLC,也可以通过modbus通讯连接松下PLC,永宏PLC,施耐德PLC,

触摸屏设备驱动程序

由于触摸屏设备简单.价格低廉,到处应用 在消费电子商品.工业控制系统.甚至航空领域都有应用 触摸屏作为一种最新的电脑输入设备,是目前最简单.方便.自然的的一种人机交互方式,具有坚固耐用.反应速度快.节省空间.易于交流等许多优点. 事实上,触摸屏是一个使多媒体信息系统改头换面的设备,它赋予多媒体系统以崭新的面貌,是极富有吸引力的全新多媒体交互设备 从技术原理来区别触摸屏,可分为5类: 1,矢量压力传感技术触摸屏 2,电阻式触摸屏 3,电容式触摸屏 4,红外线技术触摸屏 5,表面声波技术触摸屏 矢量

我的Android进阶之旅------&gt;Android SDK支持的配置标识符(有用的参考文件)

Android SDK支持的配置标致符 配置标识符 标识符值 描      述 MCC   MNC 例子: mcc310: MCC310-MNC004: MCC208-MNC00 MCC(移动国家代码,Moblie Country Code)和可选的MNC(移动网络代码,Moblie Network Code)是从SIM卡中读取的信息.例如,mcc310表示美国的运营商,mcc310-mnc004表示美国的Verizon运营商,mcc208-mnc00表示法国的Orange运营商. 如果设备使用

七、2440裸机开发 触摸屏操作

七.lcd触摸屏控制 触摸屏就是当接触了屏幕上的图形按钮时,屏幕上的触觉反馈系统可根据预先编程的程式驱动各种连结装置,可用以取代机械式的按钮面板.2440连接的是电阻式触摸屏,利用压力感应进行控制,电阻触摸屏的主要部分是一块与显示器表面非常配合的电阻薄膜屏,这是一种多层的复合薄膜,它以一层玻璃或硬塑料平板作为基层,表面涂有一层透明氧化金属(透明的导电电阻)导电层,上面再盖有一层外表面硬化处理.光滑防擦的塑料层.它的内表面也涂有一层涂层.在他们之间有许多细小的(小于1/1000英寸)的透明隔离点把

关于移动端前端开发和PC端前端开发的一点总结

首先就是操作兼容性和个移动版浏览器的兼容性:传统设备上用户利用鼠标(包括触摸版)和键盘来操作网页,放大图片.拖拽元素.进行页面滚动等等.一些常见的鼠标和键盘事件诸如mouseover.mouseout.mousemove.click.foucs.blur等为我们提供了很好的页面交互操作,具体可以参考W3school. 然而,开发支持触摸屏的网页与传统意义上的网页有很大的不同.就拿鼠标hover事件来说,例如页面上有一个表格,当鼠标指向表格的 title时你希望在附近的某个地方显示一个浮动的too

QQ概念版(WPF制作)

984 QQ概念版 编辑 QQ 概念版是腾讯首款NUI(自然用户交互)产品,全面实现了多点触摸操作.是腾讯利用微软最新一代的客户端展现层技术--WPF,打造的IM产品. 中文名 QQ 概念版 游戏类别 聊天软件NUI 游戏平台 QQ 开发商 腾讯 发行商 腾讯 目录 1简介 2系统要求 3用户评测 4产品介绍 5评测数据 6更新日志 ? Beta 1.3 ? Beta 1.2 ? Beta 1.1 1简介编辑 在实现IM的基础功能外,QQ概念版还推出了动感相框.动态背景.多Tab聊天窗口.3D交