Russian Qt Forum

Qt => Общие вопросы => Тема начата: Zmeishe от Январь 25, 2008, 15:58



Название: Какой тип данных использовать ?
Отправлено: Zmeishe от Январь 25, 2008, 15:58
Мне нужно из функции своего класса передать через QVariant список строк + два числа int для каждой строки.
Пока не было необходимости передавать числа, использовал QStringList - т.к. у QVariant имеется соответствующий конструктор.


Название: Re: Какой тип данных использовать ?
Отправлено: Emc от Январь 25, 2008, 16:10
Ну скажем такой вариант в списке передавать QString("text|1|2")
а при чтении использовать QString::section
или
вместо QStringList использовать
QHash< QString, QPair<int, int> >
//
вариантов вагон..


Название: Re: Какой тип данных использовать ?
Отправлено: Zmeishe от Январь 25, 2008, 18:17
Сделал так:

QVariant MyClass::MyFunc()
{
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);

...
 out << rowsCount << string1 << X1 << Y1 << strin2 << X2 ...

 return block;
}

И чего сразу не додумал. ???


Название: Re: Какой тип данных использовать ?
Отправлено: vregess от Январь 25, 2008, 21:05
хм.

Код:
struct MyStruct
{
  QString str;
  int a;
  int b;
};

Q_DECLARE_METATYPE(MyStruct)

...
QVariant MClass::blaFunc() const
{
  QVariantList result;
  QVariant buf;
  MyStruct data;
  // готовим данные
  for(int i=0;i<4;i++){
    data.str=QString("string %1").arg(i);
    data.a=i+2;
    data.b=i*100;
    buf.setValue(data);
    result.append(buf);
  }
  return result;
}
...
QVariant Data=blaClass->blaFunc();

if(Data.canConvert(QVariant::List)){
  QVariantList list=Data.toList();
  QListIterator<QVariant> it(list);
  QVariant buf;
  MyStruct realData;
  while(it.hasNext()){
    buf=it.next();
    if(buf.canConvert<MyStruct>()){
      realData=buf.value<MyStruct>();
      // нужные операции со структурой
    }
  }
}

мб я не правильно понял задачу? ночь на дворе  :-\
если правильно - смотрим доки по QVariant и QMetaType


Название: Re: Какой тип данных использовать ?
Отправлено: Zmeishe от Январь 26, 2008, 10:00
Это ещё лучше, чем я думал, т.к. можно использовать функцию insert. При записи в поток, это тоже что append строки шли в обратном порядке. Мне бы пришлось переделывать принимающую функцию, а теперь нет.
Спасибо.