crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

3 страниц V  < 1 2 3 >  
Ответить в данную темуНачать новую тему
Гость_Гость_*
сообщение 17.2.2015, 8:09
Сообщение #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
  опции профиля:
сообщение 17.2.2015, 9:19
Сообщение #12


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Цитата
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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 17.2.2015, 9:40
Сообщение #13





Гости








    


Массивы объявлены:

QVariant myVarName[20000];
QVariant myDataTime[20000];
QVariant myVarValue[20000];


QVariantList List1;
QVariantList List2;
QVariantList List3;
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 17.2.2015, 10:11
Сообщение #14





Гости








    


Я в текстовом поле (Я не наблюдаю значения переменных myVarName[i].
ui->textEdit_2->append(myVarName[i].toString());
Как увидеть значение массивов?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_*
сообщение 17.2.2015, 13:13
Сообщение #15





Гости








    


В отладчика переменная "myVarName[i].setValue((*it).toString());" имеет два значения, но кадое из них "no such vlue"

Как из списка писать в массив QVariant я пока не знаю?

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



Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
pfuser
  опции профиля:
сообщение 17.2.2015, 13:34
Сообщение #16


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 17.2.2015
Пользователь №: 4340

Спасибо сказали: 0 раз(а)




Репутация:   0  


Здравствуйте, еще раз.
Зарегестрировался.
Вопрос еще открыт.

Проект и тестовый файл прилагаю.
Заранее благодарен.
Прикрепленные файлы
Прикрепленный файл  Example_08.zip ( 16.95 килобайт ) Кол-во скачиваний: 118
Прикрепленный файл  Test_file.zip ( 7.11 килобайт ) Кол-во скачиваний: 122
 
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
pfuser
  опции профиля:
сообщение 17.2.2015, 15:18
Сообщение #17


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 17.2.2015
Пользователь №: 4340

Спасибо сказали: 0 раз(а)




Репутация:   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
  опции профиля:
сообщение 17.2.2015, 16:56
Сообщение #18


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 17.2.2015
Пользователь №: 4340

Спасибо сказали: 0 раз(а)




Репутация:   0  


Все правильно, что-то с типа ми объявления.

У меня объявлены массивы:
QVariant myVarName[20000];
QVariant myDataTime[20000];
QVariant myVarValue[20000];

В отладчика myVarName[х] выглядит как QVariant(QVariantList).
Правильно наверное QVariant(не знаю что).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
lanz
  опции профиля:
сообщение 17.2.2015, 20:25
Сообщение #19


Старейший участник
****

Группа: Участник
Сообщений: 690
Регистрация: 28.12.2012
Пользователь №: 3660

Спасибо сказали: 113 раз(а)




Репутация:   8  


Фишка в том, что Range() возвращает двумерный массив, т.е. вектор векторов. Доставать как то так
//Считываю список List1
        QAxObject *range1 = worksheet->querySubObject("Range(const QVariant&)",QString("A1:A%1").arg( iAllRow ) );

//Считываю список List2        
        QAxObject *range2 = worksheet->querySubObject("Range(const QVariant&)",QString("B1:B%1").arg( iAllRow ));


//Считываю список List3        
        QAxObject *range3 = worksheet->querySubObject("Range(const QVariant&)",QString("C1:C%1").arg( iAllRow ));

        List1 = qvariant_cast<QVariantList> (range1->dynamicCall("Value()"));
        List2 = qvariant_cast<QVariantList> (range2->dynamicCall("Value()"));
        List3 = qvariant_cast<QVariantList> (range3->dynamicCall("Value()"));

        QList<QVariant>::iterator it = List1.begin();
        int i=1;
        while (it != List1.end())
        {
            QVariantList lst = it->value<QVariantList>();
            ui->textEdit_2->append( lst.begin()->toString() );
            i++;
            it++;
        }

Используйте List1-3 напрямую, зачем вам копировать данные второй раз?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
pfuser
  опции профиля:
сообщение 17.2.2015, 20:43
Сообщение #20


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 17.2.2015
Пользователь №: 4340

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(lanz @ 17.2.2015, 20:25) *
Используйте List1-3 напрямую, зачем вам копировать данные второй раз?

Спасибо. Сейчас проверю.
Мне пока проще или вернее привычнее работать (думать) с массивами, чем с контейнерами.

Спасибо. Все работает. Все супер)))))))))). Теперь перейду к рисованию))))))))))))

То, что я понял.
1) Создается список переменных типа QVariant (то, что я хотел);
2) Итератор нового списка устанавливается на адрес списка, полученного из Range
QVariantList;
3) Так как размерность каждого члена двух списков одинаковая (QList<QVariant> и QVariantList), то через итератор первого списка получаем значение второй переменной.
Как-то так. Только не понятно, почему через итератор QVariantList (*it).toString не работает, но это уже не важно.

Еще раз БОЛЬШОЕ ЧЕЛОВЕЧЕСКОЕ СПАСИБО!
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

3 страниц V  < 1 2 3 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 9.7.2025, 14:17