2056
|
Qt / Общие вопросы / Re: QByteArray rawData to double[]
|
: Июнь 02, 2014, 12:02
|
Имеется массив данных QByteArray прочитанных из бинарного файла, который содержит записи значений double.
А кто мешает сразу читать эти double без левого для данного случая QByteArray Как? Я пробовал получить указатель на элемент, возвращаемый operator[] - не получилось
|
|
|
2057
|
Qt / Общие вопросы / QByteArray rawData to double[]
|
: Июнь 02, 2014, 11:29
|
Здравствуйте! Имеется массив данных QByteArray прочитанных из бинарного файла, который содержит записи значений double. Мне необходимо вывести эти значения в десятичном виде. Сейчас я делаю следующее: с помощью data() я получаю указатель на начало массива, прибавляю к нему i * sizeof(double), где i - порядковый номер интересующего меня числа. В переменную double tmp я копирую сырые данные из получившегося указателя memcpy(&tmp, массив->data() + i * sizeof(double), sizeof(double)). Вывожу tmp на экран. Это работает, но как-то уж больно криво выглядит. Как было бы наиболее корректно написать?
|
|
|
2059
|
Qt / Model-View (MV) / Динамическое добавление колонок в QTableView
|
: Июнь 02, 2014, 11:07
|
Здравствуйте. Не совсем разобрался с этой темой. У меня имеются некоторые данные в одномерном массиве. Количество значений фиксированное. Они выводятся в представление в одну колонку. В головном виджете, где сидит это представление имеется спинбокс для регулирования количества колонок, в которые будут выводится значения этого массива. Я сделал связку спинбокса и модели valueChanged->setColumnCount. Значение columns, которое изменяется слотом setColumnCount хранится в классе модели и возвращается при вызове переопределённого columnCount. Не могу понять, по каким причинам представление не перестраивается под новые значения количества колонок и строк. reset и dataChanged не помогает... Буду признателен за помощь
|
|
|
2060
|
Qt / Многопоточное программирование, процессы / Отлавливание ошибок процесса
|
: Май 22, 2014, 16:58
|
Здравствуйте. Во вложении имеется картинка. Я написал простое приложение, которое запускает QProcess и отлавливает его потоки. Сам процесс при нормальных условиях работает в режиме командной строки (запускается из bat файла). В случае, если лицензия на запускаемый процесс занята, то он выдаёт ошибку, как показано на скриншоте, причём, как видно, stderr пуст. Есть ли какие-нибудь методы по отлову подобных сообщений или что можно придумать, чтобы понять, что программа выдала ошибку. У меня на уме вертится только проверка процента ЦПУ, занимаемого данным процессом.
|
|
|
2061
|
Qt / Вопросы новичков / Re: Сериализация QString содержащей структуры.
|
: Май 31, 2013, 20:00
|
Дополняя предыдущий ответ: перед записью надо установить QDataStream::setByteOrder с аргументом чтобы понравился дельфи (вероятно QDataStream::LittleEndian)
Да, согласен. Вышеизложенное я изначально пробовал воплотить - не понравилось.
|
|
|
2062
|
Qt / Вопросы новичков / Re: Сериализация QString содержащей структуры.
|
: Май 30, 2013, 11:19
|
Да, согласен, что код ужасен.
А в этой же теме хочу спросить по поводу writeRawData. Каким образом, не используя эту функцию можно записать данные (особенно double), чтобы они в последствии могли быть считаны в среде разработки delphi?
|
|
|
2063
|
Qt / Вопросы новичков / Re: Сериализация QString содержащей структуры.
|
: Май 18, 2013, 14:52
|
Нашёл выход, более подходящий для меня! Запись структуры оставить такой же, как я описывал выше. Но, конечно, как в моём случае вписываются лишние 5 * sizeof(QString) байт - думаю, для меня это не критично. Перед чтением файла нужно сохранить значения в каждом из QString. А после чтения восстановить их на прежние места. Иными словами: char* strings[] = { reinterpret_cast<char*>(&settings.wayType), reinterpret_cast<char*>(&settings.materialName), reinterpret_cast<char*>(&settings.component1.name), reinterpret_cast<char*>(&settings.component2.name), reinterpret_cast<char*>(&settings.component3.name) }; char oldValues[sizeof(strings) / sizeof(char*) * sizeof(QString)]; for (int i = 0; i < sizeof(strings) / sizeof(char*); i++) { char* string = strings[i]; for (int j = 0; j < sizeof(QString) / sizeof(char); j++) { oldValues[sizeof(QString) / sizeof(char) * i + j] = string[j]; } }
in.readRawData(reinterpret_cast<char*>(&settings), sizeof(settings));
for (int i = 0; i < sizeof(strings) / sizeof(char*); i++) { char* string = strings[i]; for (int j = 0; j < sizeof(QString) / sizeof(char); j++) { string[j] = oldValues[sizeof(QString) / sizeof(char) * i + j]; } }
in >> settings.wayType; in >> settings.materialName; in >> settings.component1.name; in >> settings.component2.name; in >> settings.component3.name;
в середине можно было использовать memcpy, но я его не особо люблю. Теперь изменение структуры никак не повлияет на код чтения/записи. Если не трогать классы. Спасибо всем за советы.
|
|
|
2064
|
Qt / Вопросы новичков / Re: Сериализация QString содержащей структуры.
|
: Май 18, 2013, 12:36
|
а чо QSettings не воспользуетесь?
Так как это не единственное, что я записываю в файл. Туда ещё идёт свыше 1000 QVector Писать QString в виде бинарного потока в одном процессе и вычитывать в другом это очень опасно, он наверняка имеет какие-то внутренние указатели, которые в другой программе невалидны. Не делай так, записывай всю структуру через QDataStream и операторы записи в поток
вот я про эти указатели и говорю. Как-то мучительно получается по отдельности записывать и считывать каждый элемент в отдельности + при добавлении элементов в структуру нужно искать чтение и запись и снова добавлять... Уверен, что должен быть какой-то другой способ. У меня появились некоторые идеи, сейчас попробую их спрораммировать, позже отпишусь по результатам, может кому полезно будет
|
|
|
2065
|
Qt / Вопросы новичков / Re: Сериализация QString содержащей структуры.
|
: Май 18, 2013, 11:42
|
При чтении уже в другой программе: in.readRawData(reinterpret_cast<char*>(&settings), sizeof(settings));
где QFile file(filePath); file.open(QIODevice::ReadOnly); QDataStream in(&file);
для чтения строк изначально написал in >> settings.wayType; in >> settings.materialName; in >> settings.component1.name; in >> settings.component2.name; in >> settings.component3.name;
но, этот код выдавал ошибку при выполнении первой функции. Была какая-то проблема с распределением памяти. Но её я обошёл тем, что для каждой из читаемой строки выполнил метод QString::clear(). Всё пошло гладко, но только по завершению работы приложения выдается ошибка heap corruption detected... То есть, я полагаю, что при чтении из файла целиком структуры, в элементы QString были записаны какие-то произвольные значения (которые были рабочими при записи в файл). Таким образом, эти значения дают понять, что при выполнении некого деструктора (который выполняется по завершению программы) производится очистка памяти по тем самым значениям, которые были вписаны в структуру из файла, но они являются не актуальными, так как не относятся к выполняемому процессу, а просто были считаны из файла.
|
|
|
2066
|
Qt / Вопросы новичков / Re: Сериализация QString содержащей структуры.
|
: Май 18, 2013, 11:27
|
Сама структура: #ifndef SOLUTIONSETTINGS_H #define SOLUTIONSETTINGS_H
class QString;
struct ComponentSettings { QString name; double concentration; double liquidusTangent; double distributionRatio; };
struct SolutionSettings { int substrateHeight; int addingLayerHeight; int addingLayerCount; double areaWidth; double areaDepth; int NodesPerSize; int laserSpotDiameter; int laserPower; int preheatingTemperature; int gasTemperature; int laserSpeed; int distanceBetweenPasses; int penetrationRatio; int delayAfterHeating; QString wayType; double delayBetweenPasses; double calculationTimeStep; int outputTimeStep; QString materialName; double liquidusTemperature; double coresCount; double growSpeedRatio; double interaxialDistance; double porosity; double particlesDiameter; ComponentSettings component1, component2, component3; };
#endif Её записываем в файл. out.writeRawData(reinterpret_cast<char*>(&_settings), sizeof(_settings)); out << _settings.wayType << _settings.materialName << _settings.component1.name << _settings.component2.name << _settings.component3.name; binFile.close();
где SolutionSettings _settings;
и QFile binFile(slmFilePath); binFile.open(QIODevice::WriteOnly); QDataStream out(&binFile);
|
|
|
2067
|
Qt / Вопросы новичков / Сериализация QString содержащей структуры.
|
: Май 17, 2013, 06:09
|
Всем снова привет! Есть структура, которую я записываю в бинарный файл с помощью QDataStream::writeRawData. Отдельно выписываю каждый QString через оператор <<. При чтении этого файла, чтение структуры проходит успешно. А вот при чтении в QString выдает ошибку (realloc или чё-то там...) Вскоре понял, что это происходит из-за того значения, которое передаётся в QString при чтении файла. Решил проблему с помощью QString::clear() и последующим чтением QString из файла. Только теперь уже проблема возникла иная: при закрытии программы выскакивает что-то вроде heap corruped. Вопрос: какое именно значение из QString записывается при сериализации и как при десериализации избежать переписывания QString переменных или "сохранить нынешние значения QString (которое затирается при деериализации) -> прочитать файл -> восстановить это значение) Спасибо
|
|
|
2068
|
Qt / Вопросы новичков / Re: abs
|
: Май 01, 2013, 06:59
|
ребят, а в qmath функция qreal qFabs(qreal) даёт не то самое, что нужно автору?
|
|
|
2069
|
Qt / Вопросы новичков / Re: Не могу запустить пример qwt
|
: Май 01, 2013, 06:54
|
90% это означает, что у тебя в системе болтается qwt, собранная для Qt4, а ты компилиш программу под Qt5. И вот твоя прога под Qt5 пытается переварить qwt собранную для Qt4.
Если оно действительно так, то автору советую собрать qwt самостоятельно. В папке с исходниками есть инструкция по установке
|
|
|
|
|