[prev in list] [next in list] [prev in thread] [next in thread]
List: pykde
Subject: Re: regression in inputhook support from pyqt5 to pyqt6
From: Thomas Caswell <tcaswell () gmail ! com>
Date: 2021-11-30 17:38:53
Message-ID: CAA48SF8BM1nuULGqhTpZL=kdNrM3jCG6fyBe1ALAimbAUMGuiA () mail ! gmail ! com
[Download RAW message or body]
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@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@gmail.com
[Attachment #3 (text/html)]
<div dir="ltr">Phil,<div><br></div>Thanks, I can confirm it works for me on linux with \
6.2.2.dev2111291237.<div><br></div><div>Tom</div></div><br><div class="gmail_quote"><div \
dir="ltr" class="gmail_attr">On Mon, Nov 29, 2021 at 7:02 AM Phil Thompson <<a \
href="mailto:phil@riverbankcomputing.com">phil@riverbankcomputing.com</a>> \
wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px \
solid rgb(204,204,204);padding-left:1ex">On 28/11/2021 01:49, Thomas Caswell wrote:<br> > \
Folks,<br> > <br>
> There seems to have been a change in the behavior of the inputhook.<br>
> Previously, if a widget was shown, the input hook installed by pyqt <br>
> would<br>
> keep it alive and interactive while waiting for user input (either via<br>
> `input` or via the python shell). A minimal example is:<br>
> <br>
> ```python<br>
> from PyQt6 import QtWidgets<br>
> # from PyQt5 import QtWidgets<br>
> <br>
> <br>
> app = QtWidgets.QApplication(["bob"])<br>
> b = QtWidgets.QPushButton("bob")<br>
> b.clicked.connect(lambda: print("clicked"))<br>
> b.show()<br>
> print(input("type and hit enter > "))<br>
> print(input("The window should still be open > "))<br>
> ```<br>
> <br>
> This works as expected with PyQt5, but with PyQt6 the widget is closed <br>
> as<br>
> soon as you hit enter (and if the button is created in the python shell <br>
> it<br>
> will close as you hit the first key) on linux. I suspect osx and <br>
> windows<br>
> will have the same problem, but have not tested.<br>
<br>
It's not closing the windows, it just seems to hide them.<br>
<br>
> This happens with all versions of pyqt6 on pypi and at least python3.8 <br>
> and<br>
> py3.9.<br>
> <br>
> Looking at `static int qtcore_input_hook()` in<br>
> `sip/QtCore/qcoreapplication.sip` there appears to be no change between<br>
> PyQt5 and PyQt6.<br>
> <br>
> I suspect that the issue is Qt6 is better about closing all open <br>
> windows on<br>
> exiting the QAppliaction::exec as compared to Qt5, but I could not find <br>
> any<br>
> documentation on that (or smoking gun change in the source).<br>
> <br>
> I suspect that changing the then qtcore_input_hook to create an <br>
> QEventLoop<br>
> to exec, rather than exec'ing the main application is the solution.<br>
> However, I have not been able to test that directly and switching<br>
> IPython's input hook to exec'ing the full app did not break in the way <br>
> I<br>
> expected.<br>
<br>
A separate event loop seems to work (at least on macOS). Fixed in the <br>
next snapshot.<br>
<br>
Thanks,<br>
Phil<br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" \
class="gmail_signature">Thomas Caswell<br><a href="mailto:tcaswell@gmail.com" \
target="_blank">tcaswell@gmail.com</a></div>
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic