Russian Qt Forum

Qt => Qt Quick => Тема начата: kvrus от Февраль 17, 2012, 14:37



Название: соединение сигнала объекта QML с обработчиком (функцией ) в JS
Отправлено: kvrus от Февраль 17, 2012, 14:37
Задача такая.
Есть файл LineParamEdit.qml - это объект QML. У этого объекта есть сигнал
signal setParam(string name,string value, string unit);

есть файл main.qml - это основной qml документ в котором хочется отобразить несколько LineParamEdit. Для
их отображения создан файл my.js:

var component = Qt.createComponent("LineParamEdit.qml"); // определили компонент над которым происходит обработка
var linesArray       = new Array();
var coordinates = [
               [10,10],
               [10,60],
               [10,110]
            ]
var lines = [
               ["Fs","100","MHz","Sampled Frequency"],
               ["SYM","800","sml","Samples per symbol"],
               ["Flo","10","MHz","LO frequency"]
            ]
function createNewBlock(){
for (var i = 0; i < 3; i++) {
   if(component.status != Component.Ready){
      return false;
   }
   // создание объекта
   var newLine = component.createObject(convas);
   if(newLine == null){
      return false;
   }
   newLine.parameterNameText =  lines
  • ;
   newLine.parameterValueText = lines[1];
   newLine.parameterUnitText =  lines[2];
   newLine.parameterDescriptionText = lines[3];    

   newLine.setParam.connect(setParamStruct(newLine.parameterNameText,newLine.parameterUnitText,newLine.parameterUnitText));
   
   newLine.x = coordinates
  • ;                  // указать координаты нового блока
   newLine.y = coordinates[1];

   linesArray.push(newLine);               // заносим объект в массив ообъектов
}
return true;
}
function setParamStruct(name,value,unit){
   console.log(name);
   console.log(value);
   console.log(unit);
}

в main.qml скрипт импортирован и по окончанию создания qml вызывается функция динамического создания LineParamEdit

Component.onCompleted: Main.createNewBlock();

Объекты создаются как нужно, но никак не удается привязать сигналы объектов к функции обработчику setParamStruct

и строчка newLine.setParam.connect(setParamStruct(newLine.parameterNameText,newLine.parameterUnitText,newLine.parameterUnitText));
не работает.

Есть у кого нибудь идеи?


Название: Re: соединение сигнала объекта QML с обработчиком (функцией ) в JS
Отправлено: mutineer от Февраль 17, 2012, 14:41
попробуй тут почитать
http://developer.qt.nokia.com/doc/qt-4.8/qml-connections.html


Название: Re: соединение сигнала объекта QML с обработчиком (функцией ) в JS
Отправлено: kvrus от Февраль 17, 2012, 14:50
Я бы мог так же динамически создавать и объекты коннектеров:

 Connections {
     target: area
     onClicked: foo(parameters)
 }

но они полем target: привязываются к ID, а при динамическом создании LineParamEdit я им не могу ID назначить.

Что то ничего не понимаю как это работает. Есть хороший пример на динамическое формирование объектов?



Название: Re: соединение сигнала объекта QML с обработчиком (функцией ) в JS
Отправлено: Vass от Февраль 17, 2012, 16:35
попробуйте newLine.setParam.connect(setParamStruct);
Параметры там ни к чему.


Название: Re: соединение сигнала объекта QML с обработчиком (функцией ) в JS
Отправлено: kvrus от Февраль 24, 2012, 12:24
Вот что смог получить по теме "обработка сигналов динамических объектов"

Есть по вот этой ссылке:
http://doc.qt.nokia.com/4.7-snapshot/qdeclarativedynamicobjects.html
Вот такая строчка:
"To connect signals to (or receive signals from) dynamically created objects, use the signal connect() method. See Connecting Signals to Methods and Signals for more information."

Которая воодушевляет на связку посредством connect свойства, но вот ничего из этого не получается. если написать connect в QML, то все свяжется, но если из JS то не свяжется.

Поэтому есть вот такое очень специфическое решение использовать
 var newObject = Qt.createQmlObject('import QtQuick 1.0; Rectangle {color: "red"; width: 20; height: 20}',
     parentItem, "dynamicSnippet1");

если в строковую переменную с текстом QML  вписать обработчик сигнала, то он сработает.