![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() ![]() |
![]() |
Гость_Гость_* |
![]()
Сообщение
#11
|
Гости ![]() |
Это моя первая работа с Qt (моя специальность электроник, программировал в MSVC 6 более 10 лет назад).
Есть файл *.csv. В нем записана информация о работе оборудования (переменная, время, значение переменной). Данная информация собирается с интервалом в 5 секунд. Мне нужно построить график для отображения изменения переменной во времени. Я создал три массива QVariantList List1, List2, List3 и три массива QVariant myVarName[20000], QVariant myDataTime[20000], QVariant myVarValue[20000]. (Количество переменных в массивах QVariant 20000 - это пока для теста, желательно сделать динамический массив в зависимости от количества строк. Кол-во строк я получаю, а как сделать динамический массив пока точно не знаю.) Я посмотрел примерыи написал несколько вариантов программы: 1. Сначало читал весь файл - 16000 строк 5 столбцов занимает по времени 12 секунд ................................... if( fileName.contains(reg) ){ QMessageBox::information(this,"Файл открыт","Все успешно"); QTextStream stream(&mFile); QString buffer = stream.readAll(); ui->textEdit_3->setText(buffer); mFile.flush(); mFile.close(); ................................ 2. Потом читал по ячейкам (это вообще долго): ................................... for(countRow; countRow < iAllRow; ++countRow){ myVarName[countRow] = worksheet->querySubObject("Cells( int, int)", countRow, 1)->property("Value").toString(); myDataTime[countRow] = worksheet->querySubObject("Cells( int, int)", countRow, 2)->property("Value").toString(); myVarValue[countRow] = worksheet->querySubObject("Cells( int, int)", countRow, 3)->property("Value").toFloat(); } ................................................................................ ..... 3. Сейчас остановился на вашем варианте (читает бысто, выжу в отладчике): QAxObject *range1 = worksheet->querySubObject("Range(const QVariant&)","A1:A16000"); QAxObject *range2 = worksheet->querySubObject("Range(const QVariant&)","B1:B16000"); QAxObject *range3 = worksheet->querySubObject("Range(const QVariant&)","C1:C16000"); List1 = qvariant_cast<QVariantList> (range1->dynamicCall("Value()")); List2 = qvariant_cast<QVariantList> (range2->dynamicCall("Value()")); List3 = qvariant_cast<QVariantList> (range3->dynamicCall("Value()")); ................................................................................ .................................. Сейчас мне нужно из списков QVariantList List1, List2, List3 занести значения (типы Sting, DataTime, Float) соответственно в массивы myVarName[], myDataTime[], myVarValue[]. То есть, создаю итератор QList<QVariant>::iterator it = List1.begin();, указывающий на первый элемент списка List1. А вот как Первый элемент списка занести в первый элемент массива QVariant - не знаю. Пробовал по разному, не получается. ................................................................. while (it != List1.end()) { myVarName[i].setValue((*it).toString()); str1=qvariant_cast<QString>(*it); ui->textEdit_4->append(str1); i++; it++; } Как правильно перенести значения из списков QVariantList в массивы QVariant? |
|
|
lanz |
![]()
Сообщение
#12
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Цитата myVarName[i].setValue((*it).toString()); Должно работать, выглядит правильно. EDIT: Возможно что то напутано с объявлением массивов? Цитата QString buffer = stream.readAll(); ui->textEdit_3->setText(buffer); Очень странно что чтение чистого csv занимает больше чем получение тех же данных через COM. Скорее всего все время естся в методе setText. Этот способ по идее самый быстрый должен быть. Цитата Кол-во строк я получаю, а как сделать динамический массив пока точно не знаю Используйте QVector например. Сообщение отредактировал lanz - 17.2.2015, 9:24 |
|
|
Гость_Гость_* |
![]()
Сообщение
#13
|
Гости ![]() |
Массивы объявлены:
QVariant myVarName[20000]; QVariant myDataTime[20000]; QVariant myVarValue[20000]; QVariantList List1; QVariantList List2; QVariantList List3; |
|
|
Гость_Гость_* |
![]()
Сообщение
#14
|
Гости ![]() |
Я в текстовом поле (Я не наблюдаю значения переменных myVarName[i].
ui->textEdit_2->append(myVarName[i].toString()); Как увидеть значение массивов? |
|
|
Гость_Гость_* |
![]()
Сообщение
#15
|
Гости ![]() |
В отладчика переменная "myVarName[i].setValue((*it).toString());" имеет два значения, но кадое из них "no such vlue"
Как из списка писать в массив QVariant я пока не знаю? Есть какие нибудь идеи? |
|
|
pfuser |
![]()
Сообщение
#16
|
Новичок Группа: Новичок Сообщений: 6 Регистрация: 17.2.2015 Пользователь №: 4340 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Здравствуйте, еще раз.
Зарегестрировался. Вопрос еще открыт. Проект и тестовый файл прилагаю. Заранее благодарен.
Прикрепленные файлы
![]() ![]() |
|
|
pfuser |
![]()
Сообщение
#17
|
Новичок Группа: Новичок Сообщений: 6 Регистрация: 17.2.2015 Пользователь №: 4340 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Если напрямую установить значение: myVarName[3].setValue(111), то все читает хорошо.
Значит (*it).toString() указывает не на значение переменной QVariantList Если использовать it.i->t() - читает QVariantList, но записать в QVariant не могу: myVarName[i].setValue(it.i->t()); QVariantList::const_iterator it = List1.constBegin(); int i=1; while (it != List1.constEnd()) { // j=it.i->t(); myVarName[i].setValue(it.i->t()); i++; it++; } .....да |
|
|
pfuser |
![]()
Сообщение
#18
|
Новичок Группа: Новичок Сообщений: 6 Регистрация: 17.2.2015 Пользователь №: 4340 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Все правильно, что-то с типа ми объявления.
У меня объявлены массивы: QVariant myVarName[20000]; QVariant myDataTime[20000]; QVariant myVarValue[20000]; В отладчика myVarName[х] выглядит как QVariant(QVariantList). Правильно наверное QVariant(не знаю что). |
|
|
lanz |
![]()
Сообщение
#19
|
![]() Старейший участник ![]() ![]() ![]() ![]() Группа: Участник Сообщений: 690 Регистрация: 28.12.2012 Пользователь №: 3660 Спасибо сказали: 113 раз(а) Репутация: ![]() ![]() ![]() |
Фишка в том, что Range() возвращает двумерный массив, т.е. вектор векторов. Доставать как то так
Используйте List1-3 напрямую, зачем вам копировать данные второй раз? |
|
|
pfuser |
![]()
Сообщение
#20
|
Новичок Группа: Новичок Сообщений: 6 Регистрация: 17.2.2015 Пользователь №: 4340 Спасибо сказали: 0 раз(а) Репутация: ![]() ![]() ![]() |
Используйте List1-3 напрямую, зачем вам копировать данные второй раз? Спасибо. Сейчас проверю. Мне пока проще или вернее привычнее работать (думать) с массивами, чем с контейнерами. Спасибо. Все работает. Все супер)))))))))). Теперь перейду к рисованию)))))))))))) То, что я понял. 1) Создается список переменных типа QVariant (то, что я хотел); 2) Итератор нового списка устанавливается на адрес списка, полученного из Range QVariantList; 3) Так как размерность каждого члена двух списков одинаковая (QList<QVariant> и QVariantList), то через итератор первого списка получаем значение второй переменной. Как-то так. Только не понятно, почему через итератор QVariantList (*it).toString не работает, но это уже не важно. Еще раз БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО! |
|
|
![]() ![]() ![]() |
![]() |
|
Текстовая версия | Сейчас: 9.7.2025, 14:17 |