[PyQt] Can't call QTest::touchEvent(&widget)

Anton Chikin kverlin.lists at gmail.com
Thu Apr 14 12:50:34 BST 2011


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?

Anton.


More information about the PyQt mailing list