Тема: Библиотеки визуальных элементов GUI в QLua
Есть предложение поделиться наработками по поводу подключения и использования библиотек визуальных элементов в QLUA.
Начну с себя.
Как известно, разработчики приводят в документации пример таблички, говорят, что сделана на wxLua.
Я пробовал подключить ее и использовать, но пока это не особо увенчалось успехом.
Например, возьмем простейший пример из поставки wxLua под названием veryminimal.wx.lua. Замечу, что в нем содержится функция main(), которая в QLUA является обработчиком события с предопределенным названием, поэтому весь полезный код вынесем за пределы этой функции пока, вставим лишь пустую main() чтобы QLUA не ругался. В итоге выкинув все лишнее (комментарии вначале и заполнение package.cpath) получаем:
require("wx")
message("Start", 1)
frame = wx.wxFrame( wx.NULL, wx.wxID_ANY, "wxLua Very Minimal Demo",
wx.wxDefaultPosition, wx.wxSize(450, 450),
wx.wxDEFAULT_FRAME_STYLE )
frame:Show(true)
wx.wxGetApp():MainLoop()
message("End", 1)
--------
function main()
end
Если этот текст сохранить в файл и запустить, то получим открывшееся окно, созданное средствами wxLua! Вроде все здорово, и терминал Quik даже работает. Однако, если посмотреть внимательнее, по выясняется:
а) Сообщения "End" нет, выведено только "Start"
б) Напротив скрипта стоит признак "остановлен" (красный квадрат), хотя наше окно открыто и функционирует.
в) Ни один обработчик скрипта LUA не работает (если его дописать, например, onAllTrade).
Если окно закрыть - увидим сообщение "End". Выходит, скрипт наш стоял на строке
wx.wxGetApp():MainLoop()
и дальше не шел, что очень грустно.
Как же работал при этом терминал QUIK?? очевидно, внутри MainLoop() содержится цикл обработки сообщений, который вполне устраивает QUIK (во всяком случае я не нашел проблем).
Если убрать строку
wx.wxGetApp():MainLoop()
и дополнить функцию main() стандартным ожиданием остановки скрипта - терминал QUIK и вовсе зависает или что-нибудь в этом роде. Т.е. стандартный QUIK'овский обрабтчик сообщений почему-то для wxLua не подходит.
Хорошо, а что если всю эту фтуковину убрать в main(), где она вроде мешать не будет? просто скопировать в нее весь код да и все, раз уж выхода из него не происходит, пока окно не закроешь?
require("wx")
function main()
message("Start", 1)
frame = wx.wxFrame( wx.NULL, wx.wxID_ANY, "wxLua Very Minimal Demo",
wx.wxDefaultPosition, wx.wxSize(450, 450),
wx.wxDEFAULT_FRAME_STYLE )
frame:Show(true)
wx.wxGetApp():MainLoop()
message("End", 1)
end
На первый взгляд все хорошо: окно появляется, скрипт во состоянии "работает", терминал живет. Закрываем окно, скрипт останавливается. Вроде все замечательно, но при повторном запуске скрипта терминал QUIK весь падает с Internal error.
Что еще придумать - не знаю. Есть ли у кого-нибудь идеи?