Skip to content

Commit

Permalink
fix Signal-name issue for PyQt
Browse files Browse the repository at this point in the history
  • Loading branch information
jborbely committed Aug 29, 2022
1 parent 06644a6 commit d835cb2
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 8 deletions.
12 changes: 10 additions & 2 deletions msl/qt/threading.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
from . import (
QtCore,
Signal,
prompt
prompt,
binding,
)


Expand Down Expand Up @@ -223,7 +224,7 @@ def worker_disconnect(self, signal, slot):
try:
self._signals_slots.remove((signal, slot))
except ValueError:
options = '\n'.join(f'{a!r} {b}' for a, b in self._signals_slots)
options = '\n'.join(f' {a!r} {b}' for a, b in self._signals_slots)
if not options:
raise ValueError(
'No Worker signals were connected to slots') from None
Expand All @@ -241,6 +242,13 @@ def _check_signal_slot(signal, slot):
return signal, slot

if isinstance(signal, Signal):
if hasattr(signal, 'signatures'): # PyQt
signal = signal.signatures[0]
if '(' not in signal:
raise TypeError(
'Cannot determine the Signal name. Either pass in '
'the Signal name as a string or define a name '
'parameter in the Signal constructor.')
return str(signal).split('(')[0], slot

raise TypeError('signal must be a QtCore.Signal or string')
Expand Down
33 changes: 27 additions & 6 deletions tests/test_threading.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
Worker,
Signal,
Slot,
binding,
)


Expand Down Expand Up @@ -148,7 +149,7 @@ def test_connect_signal_slot():
class MyWorker(Worker):
empty = Signal()
renamed = Signal(name='new_name')
data = Signal(float)
data = Signal(float, name='floating_point')
state = Signal(bool, int)

def process(self):
Expand Down Expand Up @@ -196,6 +197,7 @@ def on_state(*args):
def on_done():
values.append('done')

is_pyqt6 = binding.name == 'PyQt6'
values = []

app = application()
Expand All @@ -210,15 +212,29 @@ def on_done():
with pytest.raises(ValueError, match='No Worker signals were connected to slots'):
t.worker_disconnect('empty', lambda: on_empty())

t.worker_connect(MyWorker.empty, on_empty)
if is_pyqt6:
with pytest.raises(TypeError, match='Cannot determine the Signal name'):
t.worker_disconnect(MyWorker.empty, on_empty)

if is_pyqt6:
# no 'name' defined in the Signal constructor
# must use the class attribute name
t.worker_connect('empty', on_empty)
else:
t.worker_connect(MyWorker.empty, on_empty)
t.worker_connect('empty', on_empty)
t.worker_connect(MyWorker.renamed, on_renamed_1)
t.worker_connect('renamed', on_renamed_3)
t.worker_connect(MyWorker.renamed, lambda: values.append('renamed-4'))
t.worker_connect('new_name', on_renamed_2)
t.worker_connect(MyWorker.data, on_data)
t.worker_connect('data', on_data_plus_10)
t.worker_connect(MyWorker.state, on_state)
t.worker_connect('floating_point', on_data_plus_10)
if is_pyqt6:
# no 'name' defined in the Signal constructor
# must use the class attribute name
t.worker_connect('state', on_state)
else:
t.worker_connect(MyWorker.state, on_state)
t.worker_connect('state', on_state)
t.finished.connect(on_done)
t.start()
Expand Down Expand Up @@ -249,8 +265,13 @@ def on_done():

t.worker_disconnect('renamed', on_renamed_3)
t.worker_disconnect(MyWorker.renamed, on_renamed_2)
t.worker_disconnect('data', on_data)
t.worker_disconnect(MyWorker.empty, on_empty)
t.worker_disconnect('floating_point', on_data)
if is_pyqt6:
# no 'name' defined in the Signal constructor
# must use the class attribute name
t.worker_disconnect('empty', on_empty)
else:
t.worker_disconnect(MyWorker.empty, on_empty)

values.clear()
t.start()
Expand Down

0 comments on commit d835cb2

Please sign in to comment.