机械唯物主义 : linjunhalida wrote:
> In my opinion,
> app = QApplication(sys.argv) >> app = QApplication()
>
> hides the detail of sys.argv may cause problem, and hard to debug.
>
> I think
> app = QApplication([]) >> app = QApplication()
> may better.
Good point, but on the other hand the C++ Qt documentation seems to strongly
imply that you really should pass the true argc and argv: they require that
argc>0, so you can't just pass NULL for argv. To avoid that you would have to
do something a bit hackish like:
int main(int argc,char**argv) {
int fake_argc = 1; // we need to declare a variable as it is passed by
reference
QApplication app(fake_argc, argv);
So I think that what they had in mind was to strongly discourage not passing
the true argv, because on some platforms it's important to be able to pass
arguments to Qt (such as -display on X11).
But it's true that a plain QApplication() constructor can look a bit too
innocuous.
On the other hand, what I think are the two best solutions
# "with" method
with QApplication: # note the lack of () as we don't provide a default
constructor
...
and
# "decorator" method
@QMainFunction
def main():
...
main()
are much clearer about the fact that Qt takes control at this point and will do
various low-level initializations, which may include parsing sys.argv.
> for myself,
> - I do not care about what exec_() returns for mainwindow,
> - and I don't think hide sys.exit in execute is a good idea: people
will confuse if the code after execute isn't run.
Perhaps I should have put the problem this way: currently, there are two ways
of exiting a PySide app. One is the Qt way, QCoreApplication.exit, and the
other is the Python way, sys.exit.
But, a major problem is that if the programmer is incorrectly expecting the app
to terminate only with sys.exit, he could forget to correctly handle the value
returned by app.exec_(), and any error value thrown by QCoreApplication.exit
will be ignored.
So my proposal is to simply translate all QCoreApplication.exit calls into
sys.exit so that the programmer only has to deal with one unified system. And
since Python provides an easy way of catching SystemError if needed, this is
not a problem.
If we want to distinguish between QCoreApplication.exit and sys.exit instead of
merging them together, it's even possible to subclass SystemError and to raise
this subclass instead of SystemError.
For the purpose of backward-compatibility, this translation would not occur
with app.exec_() but only with app.execute().
> any way, you can write this kind of code for yourself, create a
> QApplication wrapper..
You're missing the point: obviously I'm not complaining about any missing
functionality, the point is just to make it easier, fool-proof and better
adapted to Python.
I would like to add that the decorator method does have one drawback, mainly
that because main() will already have stopped running when the bulk of the
program executes, it can't catch exceptions, so you would need another function
to do the catching. The "with" method doesn't have this drawback.
Cheers,
Farsmo
_______________________________________________
PySide mailing list
[email protected]
http://lists.openbossa.org/listinfo/pyside