Russian Qt Forum

Qt => Qt Quick => Тема начата: nwnclv от Февраль 24, 2015, 01:06



Название: Спискок значений -> Список пар значений.
Отправлено: nwnclv от Февраль 24, 2015, 01:06
Приветствую!

Есть задача. Функция должна принять (из QML в С++) список значений (int) и должна вернуть список пар значений (int -> int).  Далее подобный список пар может принимать другая функция (это к тому, что подобный список пар может быть создан внутри QML и скормлен в C++ код). То есть в идеале обойтись бы каким-нибудь стандартным методом QML/JS/C++, чтоб не городить костыли вроде описания своего Qобъекта, который хранит эти пары.

Какой наиболее правильный вариант реализации сего в Qt/QML?


Название: Re: Спискок значений -> Список пар значений.
Отправлено: carrygun от Февраль 24, 2015, 05:16
JSON и QVariantMap не подходит?


Название: Re: Спискок значений -> Список пар значений.
Отправлено: nwnclv от Февраль 24, 2015, 13:07
JSON и QVariantMap не подходит?

о!, кажется то, что надо.
Тогда еще один вопрос. Я правильно понял, что писать в QVariantMap из C++ можно только с ключом типа QString?

И еще вопрос по порядку данных. то есть QVariantMap в качестве результата подходит, а вот в качестве параметра не совсем. Мне нужно как-то сохранить порядок аргументов. Например я передаю

Код
Javascript
smbus.writeObject( {7: 0, 2: 0, 3: 0, "4": 0} )
 
Я хочу, чтоб параметры пришли именно в таком порядке. 7, 2, 3, 4

В какой-нибудь QList<QPair<...>> это можно разложить вместо QVariantMap?


Название: Re: Спискок значений -> Список пар значений.
Отправлено: nwnclv от Февраль 24, 2015, 13:55
Странную вещь нашел.

Сделал вот так:

Код
C++ (Qt)
Q_INVOKABLE QVariantMap writePairs( const QList<QVariantMap> &data ) const;

и при вызове из QML


Код
Javascript
var t = {7: 0}
var d = [t, t, t];
console.log( d )
var r = smbus.writePairs( d )

я получаю пустой список. Хотя в консоль падает, что

Код:
[[object Object],[object Object],[object Object]]

----
А, понял. Нужно через QVariantList делать и потом уже приводить toMap( ).

хм. Странно все это =)


Название: Re: Спискок значений -> Список пар значений.
Отправлено: carrygun от Февраль 25, 2015, 05:34
Мне нужно как-то сохранить порядок аргументов. Например я передаю
Код
Javascript
smbus.writeObject( {7: 0, 2: 0, 3: 0, "4": 0} )
 
Я хочу, чтоб параметры пришли именно в таком порядке. 7, 2, 3, 4
Используй итераторы.


Название: Re: Спискок значений -> Список пар значений.
Отправлено: nwnclv от Февраль 25, 2015, 18:27
Используй итераторы.

Какие итераторы?

Код
C++ (Qt)
       for( QVariantMap::const_iterator b(data.begin( )), e(data.end( )); b!=e; ++b ) {
           std::cout << b.key( ).toInt( ) << ":" << b.value( ).toInt( ) << "; ";
       }
Код:
2:0; 3:0; 4:0; 7:0;
Этож мапа, а не список. Или в QVariantMap есть еще какие-то хитрые итераторы?


Название: Re: Спискок значений -> Список пар значений.
Отправлено: gil9red от Февраль 25, 2015, 19:07
Используй итераторы.

Какие итераторы?

Код
C++ (Qt)
       for( QVariantMap::const_iterator b(data.begin( )), e(data.end( )); b!=e; ++b ) {
           std::cout << b.key( ).toInt( ) << ":" << b.value( ).toInt( ) << "; ";
       }
Код:
2:0; 3:0; 4:0; 7:0;
Этож мапа, а не список. Или в QVariantMap есть еще какие-то хитрые итераторы?

У словарей тоже есть итераторы.

http://qt-project.org/doc/qt-4.8/qmap.html:
Цитировать
If you want to navigate through all the (key, value) pairs stored in a QMap, you can use an iterator. QMap provides both Java-style iterators (QMapIterator and QMutableMapIterator) and STL-style iterators (QMap::const_iterator and QMap::iterator). Here's how to iterate over a QMap<QString, int> using a Java-style iterator:

 QMapIterator<QString, int> i(map);
 while (i.hasNext()) {
     i.next();
     cout << i.key() << ": " << i.value() << endl;
 }

Here's the same code, but using an STL-style iterator this time:

 QMap<QString, int>::const_iterator i = map.constBegin();
 while (i != map.constEnd()) {
     cout << i.key() << ": " << i.value() << endl;
     ++i;
 }


Название: Re: Спискок значений -> Список пар значений.
Отправлено: nwnclv от Февраль 25, 2015, 19:32
м?

Вроде написано, что это просто 2 разных стиля итераторов. И как он поможет порядок сохранить?

Цитировать
With QMap, the items are always sorted by key.
Что логично, потому что это дерево.

но идея со списком мне тоже нравится
сделал так, например, когда порядок не важен

Код
C++ (Qt)
           function setEnable( value ) {
               var data = {7: value ? 1 : 0}
               smbus.writeBytes( data )
           }

или так, когда важен

Код
C++ (Qt)
           function setCode( code, a, b, c  ) {
               var data = [{0x3c: code}, {0x20: a, 0x21: b, 0x22: c} ]
               smbus.writeBytes( data )
           }

тогда сначала установится регистр 0x3c, а потом порядок уже не важен, поэтому это одна мапа.