Russian Qt Forum
Ноябрь 22, 2024, 11:58 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Qt script signals [реализация]  (Прочитано 5768 раз)
asvil
Гость
« : Март 28, 2010, 13:21 »

Задумалось мне сделать сигналы для qt script объектов.
Для чего это понадобилось? Для более полноценной интеграции ecma-script в с++. С помощью qt script bindings generator создаем обертки для c++ классов, а потом в qt script мало того, что появляется возможность наследования c++ классов, так еще и новые сигналы можно будет определять. А далее эти сигналы можно подсоединить как к слотам созданным в qt script, так и к c++ слотам. Вообщем, прошу оценить полезно или нет.

В заголовочном файле doxygen комментарии более подробны.

Хутки старт:

Где-то на просторах *.cpp
Код:
QScriptEngine engine;
QScriptEngineDebugger debugger;
debugger.attachTo(&engine);
createSignalHandler(&engine);

Уже среди *.(qs|js), в частности в test.js
Код:
SignalBaseClass = 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();");
Записан
Karl-Philipp
Гость
« Ответ #1 : Март 29, 2010, 11:52 »

Спасибо, взял на заметку! Улыбающийся
Записан
asvil
Гость
« Ответ #2 : Апрель 17, 2010, 12:57 »

Осуществляю продвижение библотеки и qt script плагина, дополняющие систему сигналов/слотов в qt script.
Кратко повоторюсь о возможностях:
  • Создание сигналов в qt script среде
  • Подключение данных сигналов к слотам созданным, как в qt script среде, так и в c++ коде
Ссылка на репозиторий:
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.
В случае использования библиотеки и возникновения ошибок рассказывайте в данную ветку о проблеме.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.141 секунд. Запросов: 20.