<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Thu, Sep 3, 2015 at 10:38 AM, Florian Bruhin <span dir="ltr"><<a href="mailto:me@the-compiler.org" target="_blank">me@the-compiler.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">* oliver <<a href="mailto:oliver.schoenborn@gmail.com">oliver.schoenborn@gmail.com</a>> [2015-09-03 09:41:52 -0400]:<br>
<span class="">> Thanks I'll check it out, if anything I can use some of the techniques. But<br>
> if I were to switch some tests over to pytest+qt plugin, basically the<br>
> first test would create the QApplication, and once the exec is entered in<br>
> first test, it never returns until the whole test suite is done? How does<br>
> the test driver ever regain control to start the next test (which will<br>
> presumably just create a widget and not call exec())?<br>
<br>
</span>The QApplication is created by the plugin ahead of the first test -<br>
and exec() is never called on it, only QApplication::processEvents<br>
(which processes all queued events and then returns).<br></blockquote><div> </div><div>So sendPostedEvents() is not needed (except after quitting the loop, judging by qcoreapplication::exec() source)?</div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><span class="">> With nose, we use a class that allows us to schedule "actions" (like<br>
> clicking a button, verifying the state of some object, etc). A test<br>
> basically schedules a bunch of actions (callbacks defined in the test) then<br>
> enters a custom exec() that adds a "quit" action to exit the event loop<br>
> once all actions are done, and calls the app exec(). Then control goes back<br>
> to nose and the process repeats.<br>
<br>
</span>Interesting approach - is the code for this available somewhere?<br>
<br></blockquote><div>Not right now, unfortunately. I'm hoping client agrees to release some of this stuff soon. </div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
With pytest-qt, you'd do something like:<br>
<br>
    def test_button(qtbot):<br>
        window = YourWindow()<br>
        with qtbot.waitSignal(window.action_done):<br>
            qtbot.click(window.start_action_button)<br>
<span class=""><br>
> I don't think QApplication ever gets destroyed, but its exec() is<br>
> therefore called multiple times. Isn't this how QTestLib.exec() is<br>
> meant to be used?<br>
<br>
</span>I can't find a QTestLib.exec() (and neither QTest) in the Qt<br>
documentation - what do you mean exactly?<br></blockquote><div><br></div><div>I meant QTest.qExec() (see <a href="http://doc.qt.io/qt-5/qtest.html#qExec">http://doc.qt.io/qt-5/qtest.html#qExec</a> and <a href="https://github.com/qtproject/qtbase/blob/5f5db1c38b288441d02a68f1a095850b42585e04/src/testlib/qtestcase.cpp">https://github.com/qtproject/qtbase/blob/5f5db1c38b288441d02a68f1a095850b42585e04/src/testlib/qtestcase.cpp</a>)</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
As for QApplication.exec, at least the documentation doesn't mention<br>
something special for QApplication.exit/quit - and looking at Qt's own<br>
(C++) tests, that seems to be done there as well.</blockquote><div><br></div><div>Looks like the exec() creates a QEventLoop instance, executes it, and on return from that instance's exec() and before returning to caller, does some cleanup (the aboutToQuit signal, a final sendPostedEvents). Is <a href="https://github.com/qtproject/qtbase">https://github.com/qtproject/qtbase</a> the best online place to look at Qt source? </div><div><br></div><div>Oliver</div><div><br></div></div><div class="gmail_signature"><div dir="ltr"><div></div></div></div>
</div></div>