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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Спискок значений -> Список пар значений.  (Прочитано 5211 раз)
nwnclv
Гость
« : Февраль 24, 2015, 01:06 »

Приветствую!

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

Какой наиболее правильный вариант реализации сего в Qt/QML?
« Последнее редактирование: Февраль 24, 2015, 02:01 от nwnclv » Записан
carrygun
Гость
« Ответ #1 : Февраль 24, 2015, 05:16 »

JSON и QVariantMap не подходит?
Записан
nwnclv
Гость
« Ответ #2 : Февраль 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?
Записан
nwnclv
Гость
« Ответ #3 : Февраль 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( ).

хм. Странно все это =)
« Последнее редактирование: Февраль 24, 2015, 14:02 от nwnclv » Записан
carrygun
Гость
« Ответ #4 : Февраль 25, 2015, 05:34 »

Мне нужно как-то сохранить порядок аргументов. Например я передаю
Код
Javascript
smbus.writeObject( {7: 0, 2: 0, 3: 0, "4": 0} )
 
Я хочу, чтоб параметры пришли именно в таком порядке. 7, 2, 3, 4
Используй итераторы.
Записан
nwnclv
Гость
« Ответ #5 : Февраль 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 есть еще какие-то хитрые итераторы?
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #6 : Февраль 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;
 }
Записан

nwnclv
Гость
« Ответ #7 : Февраль 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, а потом порядок уже не важен, поэтому это одна мапа.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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