[PyQt] Can't call QTest::touchEvent(&widget)
Phil Thompson
phil at riverbankcomputing.com
Thu Apr 14 13:01:17 BST 2011
On Thu, 14 Apr 2011 15:50:34 +0400, Anton Chikin <kverlin.lists at gmail.com>
wrote:
> On Thu, Apr 14, 2011 at 3:11 PM, Phil Thompson
> <phil at riverbankcomputing.com> wrote:
>> On Thu, 14 Apr 2011 13:57:09 +0400, Anton Chikin
>> <kverlin.lists at gmail.com>
>> wrote:
>>> On Wed, Apr 13, 2011 at 9:09 PM, Phil Thompson
>>> <phil at riverbankcomputing.com> wrote:
>>>> On Wed, 13 Apr 2011 14:31:05 +0400, Anton Chikin
>>>> <kverlin.lists at gmail.com>
>>>> wrote:
>>>>> Hello All,
>>>>>
>>>>> I'm using PyQt version 4.8.3-2, shipped with Ubuntu 11.04 beta.
While
>>>>> I was trying to use new multitouch testing function
>>>>> QTest::touchEvent()
http://doc.qt.nokia.com/4.7/qtest.html#touchEvent
>>>>> I've come across the issue. This piece of code
>>>>>
>>>>> from PyQt4 import QtTest
>>>>> def testMT(self):
>>>>> QtTest.QTest.touchEvent(self).press(0, QPoint(100,100))
>>>>>
>>>>> causes
>>>>>
>>>>> AttributeError: type object 'QTest' has no attribute 'touchEvent'
>>>>>
>>>>> I discovered that this function is not listed in PyQt4 docs.
>>>>>
http://www.riverbankcomputing.co.uk/static/Docs/PyQt4/html/qtest.html
>>>>>
>>>>> Could you please give me some guidelines to resolve this?
>>>>> Thank you!
>>>>> Anton Chikin.
>>>>
>>>> Hmm - not sure how it got missed. It will be in tonight's snapshot.
>>>>
>>>> Thanks,
>>>> Phil
>>>>
>>>
>>> Hi Phil,
>>>
>>> I've come across another issue using multitouch test functions.
>>> Please have a look at QTouchEventSequence doc page
>>> http://doc.qt.nokia.com/4.7-snapshot/qtest-qtoucheventsequence.html
>>> I wrote the following sample to demonstrate the issue:
>>>
>>
-------------------------------------------------------------------------------------
>>> import sys
>>> import inspect
>>> from PyQt4 import QtCore, QtGui, QtTest
>>>
>>> class MyLabel(QtGui.QLabel):
>>> def __init__(self, string, parent = None):
>>> QtGui.QLabel.__init__(self, string, parent)
>>> self.resize(500,300)
>>>
>>> def event(self, evt):
>>> if evt.type() == QtCore.QEvent.TouchBegin:
>>> print("TouchBegin!")
>>> #Double click causes QTouchEvent to be sent
>>> if evt.type() == QtCore.QEvent.MouseButtonDblClick:
>>> print("Double click!")
>>> self.testMT()
>>> return QtGui.QLabel.event(self, evt)
>>>
>>> def testMT(self):
>>> evSeq = QtTest.QTest.touchEvent(self)
>>> print(inspect.getmembers(evSeq))
>>> evSeq.press(0, QtCore.QPoint(10,10), self) #<------- Python
>>> crashes here!
>>> print("MT event sent!")
>>> return
>>>
>>> if __name__ == "__main__":
>>> app = QtGui.QApplication(sys.argv)
>>> label = MyLabel("Hello!")
>>> label.show()
>>> app.exec_()
>>> sys.exit()
>>>
>>
--------------------------------------------------------------------------------------
>>> At the line, where I try to call QTouchEventSequence.press() - Python
>>> crashes with core dump.
>>> Is this the real issue or just I am doing wrong things?
>>
>> It looks like QTouchEventSequence has a really dumb API which means
it's
>> unusable in anything other that C++ code. You have to use the instance
>> immediately - you can't make a copy on the heap to pass around and use
>> later.
>>
>> Unless anybody has any suggestions I'll remove it completely.
>>
>> Phil
>>
>
> Phil,
>
> Unfortunately, QTouchEventSequence is crucial for multitouch testing,
> because QTouchEvent constructor is private, and I can't just
> instantiate and pass to the event system.
> Maybe we'll wrap that tricky API into more Python-convenient functions
> on C++ side? What do you think?
Good luck - from my quick look I don't think it's possible, but I'm happy
to be proved wrong.
Phil
More information about the PyQt
mailing list