PyQt (but possibly C++) Very simple signal/slot "transference"/encapsulation?
-
This is a question for PyQt. However, I may be able to adapt a C++ solution, depnding on what it is....
I inherited code using a
QLineEdit. I have to change that into a (what I call) a "composite" widget, consisting of aQWidgetwhich holds aQHBoxLayoutwhich in turn holds the originalQLineEdit, plus aQPushButton; the button leads to something which can populate theQLineEdit.I'm OK with the design, apart from signal/slot handling. The outside world used to go
QLineEdit.editingFinished.connect(...). To encapsulate, I'd like it to goCompositeWidget.editingFinished.connect(...), rather than addressing theQLineEditdirectly. So I want to simply "transfer" the existingeditingFinishedsignal/slot from theQLineEditto theCompositeWidgetlevel, "transparently".This is for PyQt 5 only, not earlier versions. So far I've never had to use PyQt
@annotations (@pySignal/Slotor whatever they are), and I'm not sure I ought need to, given the definition inQLineEditinQtWidgets.pyiis already as plain asdef editingFinished(self) -> None: ...So, given that I regard minimal code as neat/desired, what is like the minimum I need to write to achieve this? I will need the outside world to be able to
connect(), my widget needs to be able toemit()it (when the user has finished interacting via the button, widget populates theQLineEditand needs that to raiseeditingFinishedsignal to the outside world). I think that's it! -
Hi,
From a C++ point of view: no problem. Signal chaining is indeed the recommended way to propagate in such a case. Just connect the original signal to your custom signal and you should be good to go.
For PyQt, I have discovered the magic of
pyqtSignal()function for the simplest "redirection". So the code looks like:class JDateEdit(QWidget): # *** THE NEXT LINE IS THE PyQt MAGIC.... *** # class variable for "editingFinished" signal editingFinished = QtCore.pyqtSignal() def initUI(self): # lineEdit holds the date self.lineEdit = QLineEdit(self) ... # connect self.lineEdit.editingFinished signal to self.editingFinished signal self.lineEdit.editingFinished.connect(self.editingFinished) de = JDateEdit() de.editingFinished.connect(...)Dunno how this compares to whatever in C++ ...
-
Hi,
From a C++ point of view: no problem. Signal chaining is indeed the recommended way to propagate in such a case. Just connect the original signal to your custom signal and you should be good to go.
-
Hi,
From a C++ point of view: no problem. Signal chaining is indeed the recommended way to propagate in such a case. Just connect the original signal to your custom signal and you should be good to go.
For PyQt, I have discovered the magic of
pyqtSignal()function for the simplest "redirection". So the code looks like:class JDateEdit(QWidget): # *** THE NEXT LINE IS THE PyQt MAGIC.... *** # class variable for "editingFinished" signal editingFinished = QtCore.pyqtSignal() def initUI(self): # lineEdit holds the date self.lineEdit = QLineEdit(self) ... # connect self.lineEdit.editingFinished signal to self.editingFinished signal self.lineEdit.editingFinished.connect(self.editingFinished) de = JDateEdit() de.editingFinished.connect(...)Dunno how this compares to whatever in C++ ...
-
Same as before except that you will have two
Q_SIGNALin the connect statement if using the old version.