On Thu, Jul 17, 2014 at 10:09:03AM -0700, Alan Irwin wrote: > On 2014-07-17 11:21-0400 Hazen Babcock wrote: > > > On 7/11/2014 2:38 PM, Alan W. Irwin wrote: > >> On 2014-07-03 12:33+0930 Jonathan Woithe wrote: > >> > >>> Hi all > >>> > >>> I have a relatively simple Qt program which utilises the PlPlot Qt widget > >>> (QtExtWidget). QtExtWidget is a component of the main application window > >>> and as such is constructed during program startup, prior to the > >>> calling of > >>> QApplication::exec() and before any GUI elements have been made > >>> visible with > >>> show(). I have noticed that during program startup I will sometimes > >>> get the > >>> following warnings: > >>> > >>> QColor::setRgb: RGB parameters out of range > >>> > >>> This doesn't appear all the time and seems to be fairly sensitive to > >>> timing, > >>> making it difficult to debug. However, after much trial and error I have > >>> determined that the warning is triggered from the QtExtWidget > >>> constructor. > >>> Further exploration showed it was coming from QtPLWidget's constructor > >>> (from which QtExtWidget is derived). > >>> > >>> Looking at the source of QtPLWidget::QtPLWidget() in plqt.cpp, I > >>> noticed a > >>> call to QApplication::processEvents() which didn't seem right to me. > >>> Commenting this out resolves the warning. Importantly, the warning > >>> remains > >>> when any of the other Qt functions (such as resize(), QPen()) are > >>> commented > >>> out. > >>> > >>> The reason I'm suspicious of this call is that there is no guarantee that > >>> any event loop has even been initialised at the time the constructors are > >>> called. Certainly in my case the event loop isn't running because > >>> QApplication::exec() has not yet been called at the time of construction. > >>> Similarly, the widget tree is not visible at event creation time, so it > >>> seems reasonable that some parts of the GUI environment (such as QColor > >>> objects) might not have been allocated yet. At a fundamental level, I > >>> expect that the processEvents() call could be triggering a draw of the as > >>> yet incompletely constructed widget. I also recall reading in the > >>> past that > >>> draw actions cannot be triggered in constructors due to the incomplete > >>> nature of the widget being built. > >>> > >>> Regardless, I can't think of any reason for calling > >>> QApplication::processEvents() in the constructor of a Qt widget. Does > >>> anyone know why this call is being made in QtPLWidget's constructor? > >>> Based > >>> on tests here and the reasons given above I think it should be > >>> removed. The > >>> trivial patch to do this is included at the end of this email. > >>> > >>> What do others think? > >> > >> I don't understand Qt that well. However, my own tests with the > >> test_interactive target indicate your change is fine so I have > >> committed it (revision 13137) with appropriate commentary to the svn > >> trunk version (which will end up as our next release). > >> > >> @Hazen: I thought I better commit this before it got lost. > >> However, as our Qt expert feel free to revert this change, if you > >> prefer some different solution. > > > > I'm not sure. If it doesn't break anything I guess it is probably ok. It > > looks like this was added by Andrew Ross in commit #10306 for Alban Rochel. > > Thanks for digging out the relevant commit. Since you are not > completely sure, I followed up further with > > svn diff --revision 10305:10306 bindings/qt_gui/plqt.cpp |less > > to confirm that the above call to QApplication::processEvents() was > part of a much more substantial change which probably nobody but Alban > understood completely, and which may well have been trying that call > experimentally (since Alban, who is no longer contributing code to > PLplot, was an extremely fast developer who > generally relied on us to test his changes). > > Here is the relevant commit message: > > ________________ > ANR for Alban Rochel - fixes for qt driver to support > > - command line arguments for the qtext driver > - flushing (as used in example 17) > ________________ > > It turns out that for a number of reasons the > test_interactive target does not test either of those capabilities. > So I have made the following tests of those capabilities by hand > (after running test_interactive to get all the required dependencies > built): > > examples/c++/qt_example -h > examples/c++/qt_example -bg 00FF00 > examples/c/x17c -dev qtwidget > > All appears to be well so combined with Jonathan Woithe's evidence, > this appears to reinforce the conclusion that removing that > QApplication::processEvents() call in revision 13137 was the right > thing to do.
I must admit I don't recall the details and your analysis seems sound, so go ahead and commit from me. Sorry I've not had time to contribute further. Andrew ------------------------------------------------------------------------------ Want fast and easy access to all the code in your enterprise? Index and search up to 200,000 lines of code with a free copy of Black Duck Code Sight - the same software that powers the world's largest code search on Ohloh, the Black Duck Open Hub! Try it now. http://p.sf.net/sfu/bds _______________________________________________ Plplot-devel mailing list Plplot-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/plplot-devel