PerlQt FAQ

general questions

Where does PerlQt come from ? Has it been around for a long time ?
Quite so! Quoting Ashley Winters (Nov 2002), the father of PerlQt : "The six-year anniversary of the birth of PerlQt is coming up next month -- Dec 26, 1996 is when Arnt Gulbrandsen's boasting about his 'new' GUI toolkit's programming contest and my hubris led me down the fateful path to PerlQt. "
PerlQt-3 is the third incarnation of this long lasting hubris 8)
What is the Smoke library ? Why is that needed ?
SMOKE is a thin wrapper around Qt, and soon KDE.
It was designed by Ashley Winters as a way to share most of what every set of bindings, regardless of the language, must implement.
Not only does it provide wrappers for every function in every class, but it also contains meta-information allowing queries of what functions are available and their arguments and return-types - in a CORBA-like way.
All classes, all methods, with all arguments, along with various flags reflecting staticness, virtuality, etc. are stored into cross-referencing arrays for fast lookups. One can thus read (and call) the whole Qt API by simply reading a few arrays.
The main purpose of SMOKE is to make it easy to write bindings from scripting languages to Qt and KDE - with an emphasis on flexibility.
Fine, but I've heard Smoke is now part of KDE. Does this mean that KDE is required ?
Not at all. PerlQt comes bundled with its own copy of Smoke and will build it if needed. If KDE happens to be there, Puic would use its root as a prefix for installation and Smoke would be stored with the others KDE libraries.
Otherwise, either the --prefix you specified or a default one would be used.
Bindings often tend to break between minor versions, or even to segfault every now and then. They are hudge and slow to compile. What about Smoke/PerlQt ?
Since Smoke reflects only the public API of Qt, it won't break between minor versions. It is as binary compatible as Qt itself.
You would typically compile it once for every major Qt version, getting a resulting shared object about half the size of traditionals, language specific bindings - yet Smoke can be used by other languages. PerlQt itself might break slightly more easily, but recompiling is trivial : it takes at most three minutes on a slow machine to build the small Perl specific object.
For what regards stability, it is worth noticing that most segfaults occur because users aren't familiar with the original language (here C++) and make mistakes. In such cases, the introspection facilities offered by Smoke are of tremendous help. One can track exactly what Qt function is called, what arguments it expects and even receive a list of closely matching functions (see Qt::debug in documentation).
Yet why should I use PerlQt in the first place ? Is there any obvious advantage over other GUI solutions ?
Well, there are plenty, but it mostly depends on your needs...
If you are looking for the most portable solution, then PerlQt might not be the answer yet. It has been known to compile on various Unix platforms including Solaris and Mac OS X (Fink), but Windows remains unexplored.
That's honestly its sole obvious shortcoming.
Consider : not only Qt is renowned for it's clean design, power, flexibility and ease of use, all qualities that map quite naturally in PerlQt- but it also comes with a full fledged RAD environment.
With Qt Designer and Puic (the PerlQt User Interface Compiler) building an application can literally be a matter of minutes.
As a mean of building prototypes, PerlQt is amazing : your GUI design is always immediately reusable in C++, since Qt Designer uses a single XML format.
Physicists and computer scientists like it because it plainly fullfill their needs for quickly developed internal applications treating signals or datas, others like the cleaner object oriented model it brings to Perl through attributes and slots/signals, others fancy the high quality of widgets and their easy subclassing... your mileage may vary.

Specific issues

I can't access some method in some classes... PerlQt says " --- No method to call for : XXX". Yet the method is referenced in Qt's documentation...
Most likely, you are trying to access a method defined in a template, within one of the parent classes.
Templates are special generic C++ classes allowing one to specify a custom type (eg. QValueList<int> for a list of integers, QValueList<float> for a list of reals)...
PerlQt can't handle those at the moment, but it should soon.
I keep experiencing strange behaviours when constructing a widget without parents (thus passing a Null pointer as the parent argument) : sometimes it just doesn't work, sometimes it segfaults. What's going wrong ?
First, while developing, it is always a good idea to use Qt::debug, or even use Qt::debug qw|verbose ambiguous calls|.
You may also enable it from the command line with
perl -MQt::debug=verbose,ambiguous,calls
Then, be very careful that Perl's idea of a Null pointer isn't zero, but 'undef'.
If that does not help, please contact us or file a bug report

The use of a camel image with the topic of Perl is a trademark of O'Reilly & Associates, Inc. Used with permission.
The Qt logo (TM) is a registered trademark of Trolltech (TM) AS, Norway.