6 local add_method
= function(qobj
, qname
, signature
, func
)
7 local stringdata
= qobj
['Lqt MetaStringData']
8 local data
= qobj
['Lqt MetaData']
9 local slots
= qobj
['Lqt Slots']
10 local sigs
= qobj
['Lqt Signatures']
11 if stringdata
==nil then
12 --print'adding a slot!'
14 stringdata
= qname
..'\0'
15 data
= setmetatable({}, {__index
=table})
16 data
:insert(1) -- revision
17 data
:insert(0) -- class name
18 data
:insert(0) -- class info (1)
19 data
:insert(0) -- class info (2)
20 data
:insert(0) -- number of methods
21 data
:insert(10) -- beginning of methods
22 data
:insert(0) -- number of properties
23 data
:insert(0) -- beginning of properties
24 data
:insert(0) -- number of enums/sets
25 data
:insert(0) -- beginning of enums/sets
26 slots
= setmetatable({}, {__index
=table})
27 sigs
= setmetatable({}, {__index
=table})
29 local name
, args
= string.match(signature
, '^(.*)(%b())$')
34 local argnum
= select(2, string.gsub(args
, '.+,', ','))+1
36 if i
>1 then arg_list
=arg_list
..', ' end
37 arg_list
= arg_list
.. 'arg' .. i
40 --print(arg_list, signature)
41 local sig
, params
= #stringdata
+ #arg_list
+ 1, #stringdata
-- , ty, tag, flags
42 stringdata
= stringdata
.. arg_list
.. '\0' .. signature
.. '\0'
43 data
:insert(sig
) -- print(sig, string.byte(stringdata, sig, sig+4), string.char(string.byte(stringdata, sig+1, sig+6)))
44 data
:insert(params
) -- print(params, string.char(string.byte(stringdata, params+1, params+10)))
45 data
:insert(#stringdata
-1) -- print(#stringdata-1, (string.byte(stringdata, #stringdata)))
46 data
:insert(#stringdata
-1) -- print(#stringdata-1, (string.byte(stringdata, #stringdata)))
50 sigs
:insert('__slot'..signature
:match
'%b()')
57 qobj
['Lqt MetaStringData'] = stringdata
58 qobj
['Lqt MetaData'] = data
59 qobj
['Lqt Slots'] = slots
60 qobj
['Lqt Signatures'] = sigs
63 local LCD_Range
= function(...)
64 local this
= QWidget
.new(...)
65 --print(this:metaObject():className(), this:metaObject():methodCount())
66 --print(this:metaObject():className(), this:metaObject():methodCount())
68 local lcd
= QLCDNumber
.new()
69 lcd
:setSegmentStyle
'Filled'
71 local slider
= QSlider
.new
'Horizontal'
72 slider
:setRange(0, 99)
75 this
:__addmethod("LuaLCD", 'valueChanged(int)')
76 this
:__addmethod("LuaLCD", 'setValue(int)', function(_
, val
) slider
:setValue(val
) end)
77 QObject
.connect(slider
, '2valueChanged(int)', lcd
, '1display(int)')
78 QObject
.connect(slider
, '2valueChanged(int)', this
, '2valueChanged(int)')
80 local layout
= QVBoxLayout
.new()
82 layout
:addWidget(slider
)
83 this
:setLayout(layout
)
87 local new_MyWidget
= function(...)
88 local this
= QWidget
.new(...)
90 local quit
= QPushButton
.new(QString
.new
'Quit')
91 quit
:setFont(QFont
.new(QString
.new
'Times', 18, 75))
93 QObject
.connect(quit
, '2clicked()', this
, '1close()')
95 local grid
= QGridLayout
.new()
96 local previousRange
= nil
99 local lcdrange
= LCD_Range()
100 grid
:addWidget(lcdrange
, row
, column
)
101 if previousRange
then
102 QObject
.connect(lcdrange
, '2valueChanged(int)',
103 previousRange
, '1setValue(int)')
105 previousRange
= lcdrange
109 local layout
= QVBoxLayout
.new()
110 layout
:addWidget(quit
)
111 layout
:addLayout(grid
)
112 this
:setLayout(layout
)
116 app
= QApplication
.new(1 + select('#', ...), {arg
[0], ...})
117 app
.__gc
= app
.delete
-- take ownership of object
119 widget
= new_MyWidget()