Название: Qt script signals [реализация]
Отправлено: asvil от Март 28, 2010, 13:21
Задумалось мне сделать сигналы для qt script объектов. Для чего это понадобилось? Для более полноценной интеграции ecma-script в с++. С помощью qt script bindings generator создаем обертки для c++ классов, а потом в qt script мало того, что появляется возможность наследования c++ классов, так еще и новые сигналы можно будет определять. А далее эти сигналы можно подсоединить как к слотам созданным в qt script, так и к c++ слотам. Вообщем, прошу оценить полезно или нет. В заголовочном файле doxygen комментарии более подробны. Хутки старт: Где-то на просторах *.cppQScriptEngine engine; QScriptEngineDebugger debugger; debugger.attachTo(&engine); createSignalHandler(&engine); Уже среди *.(qs|js), в частности в test.jsSignalBaseClass = function() { this.test = "signalBaseClass"; // создаем сигналы this.baseSignal = signal(); this.intSignal = signal(); }; SignalBaseClass.prototype.emitBaseSignal = function() { // генерируем сигнал this.baseSignal.emit("emitBaseSignal from " + this.test); }; SignalBaseClass.prototype.emitBaseSignal2 = function() { // генерируем сигнал this.baseSignal.emit("emitBaseSignal2 from " + this.test); }; SignalBaseClass.prototype.emitBaseIntSignal = function() { // генерируем сигнал this.intSignal.emit(123); };
SignalClass.prototype = new SignalBaseClass(); SignalClass = function() { // Вызываем родительский конструктор SignalBaseClass.call(this); // создаем новый сигнал this.newSignal = signal(); this.test = "signalClass"; };
// переопределяем метод SignalClass.prototype.emitBaseIntSignal = function() { this.intSignal.emit(456); };
SignalClass.prototype.emitNewSignal = function() { this.newSignal("emitNewSignal from " + this.test, "param2", 3); };
// слот являющийся дочерним свойством глобального объекта testSlot = function() { print("testSlot arguments count: " + arguments.length); for (var i = 0; i < arguments.length; ++i) print("testSlot first argument: " + arguments[i]); };
// класс содержащий слот SlotClass = function() { this.name = "slotClass"; };
SlotClass.prototype.slot = function() { print(this.name + " slot arguments count: " + arguments.length); for (var i = 0; i < arguments.length; ++i) print(this.name + " argument(" + i + ") " + arguments[i]); }; // создаем объект baseObject = new SignalBaseClass(); // создаем объект slotObject = new SlotClass();
// соединяем сигнал со слотом baseObject.intSignal.connect(testSlot); // вызываем метод класса, который в свою очередь генерирует сигнал baseObject.emitBaseIntSignal();
signalObject = new SignalClass(); signalObject.baseSignal.connect(testSlot); signalObject.newSignal.connect(slotObject, slotObject.slot); signalObject.emitNewSignal();
signalObject.newSignal.connect('testSlot'); signalObject.newSignal.connect(slotObject, 'slot');
// отсоединяем слот baseObject.intSignal.disconnect(testSlot); baseObject.emitBaseIntSignal(); // отсоединяем слот signalObject.newSignal.disconnect(slotObject, slotObject.slot); signalObject.emitNewSignal(); signalObject.emitBaseSignal(); // отсоединяем все слоты signalObject.baseSignal.disconnect(); signalObject.emitBaseSignal();
// Отключить все слоты signalObject.newSignal.disconnect(); // Отключить все слоты данного объекта signalObject.newSignal.disconnect(slotObject); // Отключить данный слот signalObject.newSignal.disconnect(slotObject, slotObject.slot);
Возвращаясь в c++QFile file("test/test.js"); if (file.open(QIODevice::ReadOnly)) { QString string(file.readAll()); engine.evaluate(string, "test.js", 0); } QLineEdit lineEdit4(0); lineEdit4.setWindowTitle("4C++ LineEdit"); lineEdit4.show(); // подключаемся qScriptConnect(engine.globalObject().property("baseObject"),"baseSignal",&lineEdit4, SLOT(setText(QString))); engine.evaluate("baseObject.emitBaseSignal();"); // отключаемся qScriptDisconnect(engine.globalObject().property("baseObject"), "baseSignal", &lineEdit4, SLOT(setText(QString)));
engine.evaluate("baseObject.emitBaseSignal2();");
Название: Re: Qt script signals [реализация]
Отправлено: Karl-Philipp от Март 29, 2010, 11:52
Спасибо, взял на заметку! :)
Название: Re: Qt script signals [реализация]
Отправлено: asvil от Апрель 17, 2010, 12:57
Осуществляю продвижение библотеки и qt script плагина, дополняющие систему сигналов/слотов в qt script. Кратко повоторюсь о возможностях: - Создание сигналов в qt script среде
- Подключение данных сигналов к слотам созданным, как в qt script среде, так и в c++ коде
Ссылка на репозиторий: http://gitorious.org/qtscriptsignalhandler/ (http://gitorious.org/qtscriptsignalhandler/) Там же можно найти краткое wiki. Достоинство и недостаток одновременно в том, что в качестве системы сборки используется CMake >= 2.6. Данный проект содержит в себе библиотеку, qt script плагин, qt assistant документацию на русском, а также два исходных файла перевода, которые не переведены, но имеются на будущее:) Инсталяция всего вышеперечисленного производится в директорию c qt framework'ом. Инсталляция в *nix. mkdir release cd release cmake -DCMAKE_BUILD_TYPE=Release .. make && make install
Отладочная версия: mkdir debug cd debug cmake -DCMAKE_BUILD_TYPE=Debug .. make && make install
Инсталяция в win* Пуск/Qt Command Promt cmake . -DCMAKE_BUILD_TYPE=Release -G "MinGW Makefiles" mingw32-make mingw32-make install
После выполненных действий открывайте assistant. В случае использования библиотеки и возникновения ошибок рассказывайте в данную ветку о проблеме.
|