add GC for QGET, QFUN return values; fix possible memory leaks (e.g. overridden metho...
[eql:eql.git] / Qt_EQL / README.txt
1 BUILD
2 =====
3
4     1) Qt/trafficlight.pro
5
6     2) EQL_Qt.pro
7
8     3) in example 9:
9        eql make-local-server-fasl.lisp
10        eql make-editor-fasl.lisp
11        copy all of:
12            eql-local-server.fas
13            eql-editor.fas
14            data/*
15        to EQL/
16
17 RUN
18 ===       
19
20     1) EQL_Qt (executable)
21
22     2) in EQL/:
23        eql eql-editor.fas trafficlight.lisp
24        eval the line: (in-package :trafficlight)
25        [...]
26
27
28 See Qt/trafficlight.cpp:eql_fun() for an example of how to call a Lisp
29 function from Qt.
30
31 The parameter *qt-main* is bound to the main Qt widget.
32
33 To get the 3 child widgets, identified by QObject::objectName(), do:
34
35     (qfind-child *qt-main* "red")
36     (qfind-child *qt-main* "yellow")
37     (qfind-child *qt-main* "green")
38
39 From Lisp you can call: (note "qfun*" and ":qt")
40
41     (qfun* *qt-main* :qt "stop")
42     (qfun* *qt-main* :qt "start")
43
44 This is possible because these 2 methods are declared Q_INVOKABLE
45 in Qt/trafficlight.h.
46
47 In order to call generic Qt functions, signals, slots from *qt-main* and child
48 objects, simply use the standard qfun (not qfun* as above), qget etc.
49
50 You can't use qoverride for external Qt/C++ classes.
51
52 The class name returned by qt-object-name is the first vanilla Qt class
53 encountered walking up the super classes; in this example, *qt-main* is shown of
54 type "QWidget", because the TrafficLight class directly inherits QWidget.
55
56 --
57
58 To prepare a Qt/C++ project to be linked with EQL (as in this example), you
59 need to make these 2 changes in your *.pro file:
60
61     TEMPLATE = lib
62     CONFIG   += staticlib
63
64 Following, include the above library name in your Qt_EQL.pro file:
65
66     LIBS += -lmy_qt_app
67
68 Additionally, you need to adapt the main.cpp, as shown in this example,
69 including Qt header file(s), creating the Qt main class, calling EQL.exec() etc.
70
71 --
72
73 You need to add:
74     
75     #include "eql_fun.h"
76
77 in the header file(s) of your Qt project which you include in main.cpp, and in
78 the cpp files which use eql_fun().
79
80 Since Qt has its own keywords which would clash with some ECL/C keywords, you
81 need to substitute some Qt keywords (only in the header file(s) which you need
82 to include in main.cpp):
83
84     Q_SLOTS   instead of slots
85     Q_SIGNALS instead of signals
86     Q_FOREACH instead of foreach
87     QSLOT     instead of SLOT
88     QSIGNAL   instead of SIGNAL