regression in inputhook support from pyqt5 to pyqt6

Thomas Caswell tcaswell at gmail.com
Sun Nov 28 01:49:03 GMT 2021


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.

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.

Tom

-- 
Thomas Caswell
tcaswell at gmail.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.riverbankcomputing.com/pipermail/pyqt/attachments/20211127/28ac5246/attachment.htm>


More information about the PyQt mailing list