Implementation of TouchArea using TUIO API for QML application
-
Hello,
I am implementing a TUIO API interface for multiple touch screen able to touch several touch screen simultaneously.Is is nearly working:
I have several instance of a class :
@class SdcnApplicationViewer
: public QDeclarativeView, TUIO::TuioListener@For every TUIO Event I use a Qt function to emit deep asome touch event and reach the touch areas
@//Send Event to main application
QApplicationPrivate *qAppPriv = QApplicationPrivate::instance();
qAppPriv->translateRawTouchEvent(this,QTouchEvent::TouchScreen,touchPointsList);@have for the moment 3 instance of my SdcnApplicationViewer
- one receives All event of translateRawTouchEvent
- one receives All only the Touchbegin event of translateRawTouchEvent
- one receives no event of translateRawTouchEvent
Does someone has information of about the translateRawTouchEvent and how it dispatches data from application to toucareas
--
-
Hi,
I finaly succeeded !!All I had to do is to create one static background Widget which is parent of all SdcnApplicationViewer instance -using setParent methode.
Then I call translaterawTouchEvent on this static widgetFor future debug feature I need to trace the touchEvents from this backgroundwidget but the event is not call with touch event , only updatedisplay and mouse over.
What Method should I overload to trace touch events??
Here after is the SdcnBackgroundWidget class I made:
@class SdcnBackgroundWidget
: public QWidget
{
Q_OBJECT
public:
explicit SdcnBackgroundWidget ( QWidget * parent = 0, Qt::WindowFlags f = 0 );
virtual ~SdcnBackgroundWidget ( );protected:
bool event ( QEvent* event );
};
@
@SdcnBackgroundWidget::SdcnBackgroundWidget ( QWidget * parent, Qt::WindowFlags f )
:QWidget( parent, f )
{}
SdcnBackgroundWidget::~SdcnBackgroundWidget()
{
}
//-----------------------------------------------------------------------------
bool SdcnBackgroundWidget::event( QEvent* event )
{
qDebug()<< "SdcnBackgroundWidget::event" << event->type();
}@ -
Hi,
I improve the implementation but it required a modification in QTGui4.dll.
The idea was to set a specific pressure that allow to filter touch event.
System touch event pressure are only 0 or 1, so I added a static member
touchEventPressurFilter which allow to ignore those.@void QApplicationPrivate::translateRawTouchEvent(QWidget *window,
QTouchEvent::DeviceType deviceType,
const QListQTouchEvent::TouchPoint &touchPoints)
{
QApplicationPrivate *d = self;
typedef QPair<Qt::TouchPointStates, QListQTouchEvent::TouchPoint > StatesAndTouchPoints;
QHash<QWidget *, StatesAndTouchPoints> widgetsNeedingEvents;//TestTuio if(touchEventPressurFilter>=0) for (int i = 0; i < touchPoints.count(); ++i) { QTouchEvent::TouchPoint touchPoint = touchPoints.at(i); if(touchPoint.pressure()!=touchEventPressurFilter) { //qDebug()<< "Ignore WM_TOUCH Events: filter on pressure value: "<<touchPoint.pressure()<< touchEventPressurFilter; return; } }@
The only problem left is when my application is creating popup (a framed window which can be moved), they do not take touch event into account.
the popup is made of a class Q_DECL_EXPORT SdcnPopup: public QMainWindow
all instance are set to be children of the global SdcnBackgroundWidget whici is parent of all other application viewer:
@// Parent is null when TUIO is not active
setParent( SdcnBackgroundWidget::getInstance() );@ -
Conclusion:
Hello,
I am implementing a TUIO API interface for multiple touch screen able to touch several touch screen simultaneously.
It is working!0./ I add a modiffication into:
qapplication_p.h
@public:
//Add a filter to completely ignore touch event if they do not match the pressure value
//only when touchEventPressurFilter>0 !!
static qreal touchEventPressurFilter;@
and also into gui\kern@el\qapplication.cpp
so the methode translateRawTouchEvent can ignore touch event based on a pressure value
@//Add a filter to completely ignore touch event if they do not match the pressure value
//only when touchEventPressurFilter>0 !!
qreal QApplicationPrivate::touchEventPressurFilter = -1;@@void QApplicationPrivate::translateRawTouchEvent(QWidget *window,
QTouchEvent::DeviceType deviceType,
const QListQTouchEvent::TouchPoint &touchPoints)
{
QApplicationPrivate *d = self;
typedef QPair<Qt::TouchPointStates, QListQTouchEvent::TouchPoint > StatesAndTouchPoints;
QHash<QWidget *, StatesAndTouchPoints> widgetsNeedingEvents;//TestTuio if(touchEventPressurFilter>=0) for (int i = 0; i < touchPoints.count(); ++i) { QTouchEvent::TouchPoint touchPoint = touchPoints.at(i); if(touchPoint.pressure()!=touchEventPressurFilter) { //qDebug()<< "Ignore WM_TOUCH Events: filter on pressure value: "<<touchPoint.pressure()<< touchEventPressurFilter; return; } }@
1./ I have several instance of a class :
@class SdcnTUIOApplicationViewer
: public QDeclarativeView, TUIO::TuioListener@2./ Only one instance is listening the TUIO UDP frames All instance are child of a static global background widget, setparent() is called during initialisation:
The filter/pressure value is also set once during initialisation of one of the ApplicationViewer instance
@ //GlobalWidget use for multitouch
if(globalWidget==NULL)
{//globalWidget Must fill the virtual desktop globalWidget = new SdcnBackgroundWidget( 0, Qt::Tool|Qt::FramelessWindowHint ); //Set geometry instead of maximized ! ((QWidget*)globalWidget)->setGeometry(0,0,mGlobalVirtualScreenWidth,mGlobalVirtualScreenHeight); globalWidget->m_initialSize.setWidth( mGlobalVirtualScreenWidth ); globalWidget->m_initialSize.setHeight( mGlobalVirtualScreenHeight ); ((QWidget*)globalWidget)->setVisible(true); //Set the background color of the globalwidget ((QWidget*)globalWidget)->setStyleSheet("* { background-color: rgb(50, 50, 50); }"); this->setParent(globalWidget); //Main application : QApplicationPrivate *qAppPriv = QApplicationPrivate::instance(); //Set pressure filter value to ignore system nativ touch events qAppPriv->touchEventPressurFilter=TUIO_PRESSURE_VALUE; } else this->setParent(globalWidget);@
3./ The translateRawTouchEvent methode is then alled on the top most widget of the application (even detached popup)
@ //Main application :
QApplicationPrivate *qAppPriv = QApplicationPrivate::instance();//Get the topest widget, even Detached popup windows: QWidget* lToplevelWidget= QApplication::topLevelAt(QPoint(posInScreen.x(), posInScreen.y())); qAppPriv->translateRawTouchEvent(lToplevelWidget,QTouchEvent::TouchScreen,touchPointsList);@