regression in inputhook support from pyqt5 to pyqt6

Thomas Caswell tcaswell at gmail.com
Tue Nov 30 17:38:53 GMT 2021


Phil,

Thanks, I can confirm it works for me on linux with 6.2.2.dev2111291237.

Tom

On Mon, Nov 29, 2021 at 7:02 AM Phil Thompson <phil at riverbankcomputing.com>
wrote:

> 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
>


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


More information about the PyQt mailing list