regression in inputhook support from pyqt5 to pyqt6
Phil Thompson
phil at riverbankcomputing.com
Mon Nov 29 12:02:53 GMT 2021
On 28/11/2021 01:49, Thomas Caswell wrote:
> Folks,
>
> There seems to have been a change in the behavior of the inputhook.
> Previously, if a widget was shown, the input hook installed by pyqt
> would
> keep it alive and interactive while waiting for user input (either via
> `input` or via the python shell). A minimal example is:
>
> ```python
> from PyQt6 import QtWidgets
> # from PyQt5 import QtWidgets
>
>
> app = QtWidgets.QApplication(["bob"])
> b = QtWidgets.QPushButton("bob")
> b.clicked.connect(lambda: print("clicked"))
> b.show()
> print(input("type and hit enter > "))
> print(input("The window should still be open > "))
> ```
>
> This works as expected with PyQt5, but with PyQt6 the widget is closed
> as
> soon as you hit enter (and if the button is created in the python shell
> it
> will close as you hit the first key) on linux. I suspect osx and
> windows
> will have the same problem, but have not tested.
It's not closing the windows, it just seems to hide them.
> This happens with all versions of pyqt6 on pypi and at least python3.8
> and
> py3.9.
>
> Looking at `static int qtcore_input_hook()` in
> `sip/QtCore/qcoreapplication.sip` there appears to be no change between
> PyQt5 and PyQt6.
>
> I suspect that the issue is Qt6 is better about closing all open
> windows on
> exiting the QAppliaction::exec as compared to Qt5, but I could not find
> any
> documentation on that (or smoking gun change in the source).
>
> I suspect that changing the then qtcore_input_hook to create an
> QEventLoop
> to exec, rather than exec'ing the main application is the solution.
> However, I have not been able to test that directly and switching
> IPython's input hook to exec'ing the full app did not break in the way
> I
> expected.
A separate event loop seems to work (at least on macOS). Fixed in the
next snapshot.
Thanks,
Phil
More information about the PyQt
mailing list