[PyQt] How to connect the activated signal of QWinEventNotifier to a custom slot in pyqt 5.6

slepton at posteo.de slepton at posteo.de
Tue Jan 31 12:39:53 GMT 2017


Hi Phil

unfortunaly it didn't work. A minimal example of what I am doing 
(wrong):


import ctypes
import win32event
from PyQt5.QtCore import QObject, pyqtSlot
from PyQt5.QtCore import QWinEventNotifier


class MyController(QObject):

     def __init__(self, connect_to_decorated_slot=True) -> None:
         super().__init__()
         self.win_receive_event = int(win32event.CreateEvent(None, 0, 0, 
None))
         self.qt_read_event_notifier = 
QWinEventNotifier(ctypes.c_int(self.win_receive_event), parent=self)
         if connect_to_decorated_slot == True:
             
self.qt_read_event_notifier.activated.connect(self.decorated_event_slot)
         else:
             
self.qt_read_event_notifier.activated.connect(self.event_slot)

     def event_slot(self, event):
         print('Event')

     @pyqtSlot('Qt::HANDLE')
     def decorated_event_slot(self, event):
         print('Event')


Running the code I get the following output(s):

>>> MyController(connect_to_decorated_slot=True)

Traceback (most recent call last):
   File "<pyshell#0>", line 1, in <module>
     MyController(connect_to_decorated_slot=True)
   File "D:/test.py", line 14, in __init__
     
self.qt_read_event_notifier.activated.connect(self.decorated_event_slot)
TypeError: connect() failed between activated(Qt::HANDLE) and 
decorated_event_slot()


>>> MyController(connect_to_decorated_slot=False)

Traceback (most recent call last):
   File "<pyshell#1>", line 1, in <module>
     MyController(connect_to_decorated_slot=False)
   File "D:/test.py", line 16, in __init__
     self.qt_read_event_notifier.activated.connect(self.event_slot)
TypeError: connect() failed between activated(Qt::HANDLE) and unislot()


I guess I am completely missing something...

Sebastian




Am 31.01.2017 13:14 schrieb Phil Thompson:
> On 31 Jan 2017, at 11:59 am, slepton at posteo.de wrote:
>> 
>> Hi Phil,
>> 
>> thanks for the quick reply.
>> 
>> 
>> 1. Looking at QWinEventNotifier the Signal is voidptr, right?
>> 
>> class QWinEventNotifier(QObject):
>>    """
>>    QWinEventNotifier(parent: QObject = None)
>>    QWinEventNotifier(sip.voidptr, parent: QObject = None)
>>    """
>>    def activated(self, sip_voidptr): # real signature unknown; 
>> restored from __doc__
>>        """ activated(self, sip.voidptr) [signal] """
>>        pass
>> 
>> 
>> 
>> 2. Looking at the connection error
>> 
>>     TypeError: connect() failed between activated(Qt::HANDLE)
>> 
>> I would assume,  that  voidptr is acctually  a Qt::HANDLE  
>> (http://doc.qt.io/qt-5.6/qt.html#HANDLE-typedef)  which I couldn't 
>> find in from PyQt5.QtCore import Qt , is this even the right place to 
>> look?
>> 
>> 
>> 
>> 3. I am not sure I understand correctly what to do, so far the slot I 
>> connected to looked like
>> 
>> @pyqtSlot(int)
>> def event_slot(self, event):
>>    # do something ...
>> 
>> For the @pyqtSlot decorator I additionally tried @pyqtSlot() and in a 
>> desperate attempt @pyqtSlot(ctypes.c_int)  since this would be the 
>> correct type for the win32event.
>> 
>> What decorator can I use to further track down the problem?
> 
> @pyqtSlot('Qt::HANDLE')
> 
> should work, but you don't need a decorator at all.
> 
> Phil


More information about the PyQt mailing list