It looks like you're new here. If you want to get involved, click one of these buttons!
I tried to create dialog box with several controls of same type and use same signal handler for all of them. But self.sender()
returned None
.
class Test_Dialog(pya.QDialog): def __init__(self, parent, current_view, names): super(Test_Dialog, self).__init__(parent) self.current_view = current_view self.setWindowTitle('Test') self.resize(200, 400) layout = pya.QVBoxLayout(self) self.setLayout(layout) for name in names: check_box = pya.QCheckBox(name, self) check_box.tristate = False check_box.checkState = pya.Qt_CheckState('Checked') check_box.stateChanged = self.check_box_stateChanged layout.addWidget(check_box) def check_box_stateChanged(self, state): print(self.sender()) def test(): app = pya.Application.instance() current_view = app.main_window().current_view() window = Test_Dialog(app.main_window(), current_view, ['1', '2', '3']) window.show()
I used 0.26.4 Ubuntu build from KLayout site.
Couple of more questions:
sender()
is cast to proper type with qobject_cast
. Is there equivalent in Qt bindings? If not, how sender()
should be used (for example, custom properties)?pya.Qt_CheckState('Checked')
in code above) correct? If so, I think it'll be reasonable to make them enum classes.
Comments
Hi,
currently, "sender()" isn't available in KLayout Qt binding flavour.
The reason is that unlike in C++ Qt, the receiver can be any method of any class. In fact the binding is not built upon an emulation of the Qt signal/slot mechanism. You can actually add any callable to a Qt signal.
This means you can use a lambda to add the sender parameter in case you want the same method to handle two events from different signals:
When the actions you want to take on a signal are not complex, you can even only use a lambda and you don't need a method for handling the signal.
Regards,
Matthias
Hi, Matthias!
Thank you for explanations! It may be reasonable to add this to documentation.