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 aQWidget
which holds aQHBoxLayout
which 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 theQLineEdit
directly. So I want to simply "transfer" the existingeditingFinished
signal/slot from theQLineEdit
to theCompositeWidget
level, "transparently".This is for PyQt 5 only, not earlier versions. So far I've never had to use PyQt
@
annotations (@pySignal/Slot
or whatever they are), and I'm not sure I ought need to, given the definition inQLineEdit
inQtWidgets.pyi
is 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 theQLineEdit
and needs that to raiseeditingFinished
signal to the outside world). I think that's it! -
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.
-
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_SIGNAL
in the connect statement if using the old version.