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