Виталий Антипов
Виталий Антипов23 марта 2018 г. 10:24

Чтение бинарного файла и вывод в QML

Добрый день! Решил изучить работу с бинарными файлами. Есть прибор, который результаты преобразования сигналов записывает в бинарные файлы. С помощью hex-редактора практически разобрался со структурой записей. Для начала решил поиграться с чтением количества и времени измерений по конкретной дате с выводом в QML ListView.

main.cpp
#include <QGuiApplication>
#include <QApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <datearrays.h>
int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QApplication app(argc, argv);
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    QObject *root = engine.rootObjects().first();
    Datearrays *datar = new Datearrays();
    QObject::connect(root, SIGNAL(qmlLoadArrays()), datar, SLOT(load()));
    if (engine.rootObjects().isEmpty())
        return -1;
    return app.exec();
}
datearrays.h
#ifndef DATEARRAYS_H
#define DATEARRAYS_H
#include <QObject>
#include <QDebug>
#include <QDataStream>
#include <QFile>
class Datearrays : public QObject
{
    Q_OBJECT
public:
    explicit Datearrays(QObject *parent = 0);
    ~Datearrays();    
    int k = 0; //счетчик количества найденных измерений по дате
    QVector<int> list; //массив с данными времени измерений по дате
public slots:
    void load(); //функция чтения бинарного файла с отправкой данных в QML
};
#endif // DATEARRAYS_H
datearrays.cpp
#include "datearrays.h"
Datearrays::Datearrays(QObject *parent) : QObject(parent)
{
}
Datearrays::~Datearrays()
{
}
void Datearrays::load()
{
    QObject* l = this->parent()->findChild<QObject*>("list");
    QFile file("ARRAYS.DAT");
    file.open(QIODevice::ReadOnly);
    int razmer = 0;
    razmer = file.size(); //размер файла в байтах
    QDataStream in(&file);
//в бинарном файле дата и время измерений записаны как символы размером 1 байт,
//в переводе в десятичную систему 4 3 18 0 5 16 47, что соответствует 04/03/2018 05:16:47
    unsigned char *int1 = new unsigned char[razmer]; //первый символ дата/время
    unsigned char *int2 = new unsigned char[razmer]; //второй символ дата/время
    unsigned char *int3 = new unsigned char[razmer]; //третий символ дата/время
    unsigned char *int4 = new unsigned char[razmer]; //четвертый символ дата/время
    unsigned char *int5 = new unsigned char[razmer]; //пятый символ дата/время
    unsigned char *int6 = new unsigned char[razmer]; //шестой символ дата/время
    unsigned char b; //какой-то не интересный символ, будет им читать, но не сохранять
    while (!in.atEnd()){
//ищем дату 04/03/2018
        in >> int1[k]; //читаем в первый символ все подряд, пока он не станет '4'
        if(int1[k]==4){
            in >> int2[k]; //в таком случае читаем во второй символ, пока он не станет '3'
            if(int2[k]==3){
                in >> int3[k]; //продолжаем с третьим символом, пока он не станет '18'
                if(int3[k]==18){ //нашли искомую дату!!!
                    in >> b; //пропускаем символ '0' и записываем символы времени
                        in >> int4[k]; //часы
                        in >> int5[k]; //минуты
                        in >> int6[k]; //секунлы
                        qDebug()<<k<<" "<<int1[k]<<"-"<<int2[k]<<"-"<<int3[k]<<" "<<int4[k]<<":"<<int5[k]<<":"<<int6[k]; //все отлично в консоли
                        list<<int4[k]; //пробуем записать часы в вектор
                        qDebug()<<list[k]; //записывается отлично
                        k++;
                }
            }
        }
    }
    k = k-1;
    qDebug()<<"k"<<k; //счетчик на месте
//а теперь надо полученные данные вывести в QML
    //l->setProperty("rows", k); //приложение падает SIGSEGV segmentation fault
    //l->setProperty("array", list); 
    //no matching function for call to 'QObject::setProperty(const char [6], QVector<int>&)'
}
Вот такой облом :( Алгоритм работает до команды вывода в QML. С QVariantList то же самое. Но самое обидное что обычный int не могу передать. Подскажите, в чем может быть проблема?
Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

3
Виталий Антипов
  • 23 марта 2018 г. 10:31
  • (ред.)

Ой, простите за невнимательность!

Datearrays *datar = new Datearrays(root);
конечно же. Увидел когда перечитал. По no matching function for call to 'QObject::setProperty(const char [6], QVector<int>&)' объясните пожалуйста.
P.S. Не вижу кнопочки редактирования темы.
    Виталий Антипов
    • 23 марта 2018 г. 10:51

    Помогло использование QVariant::fromValue()

    l->setProperty("array", QVariant::fromValue(list));
    Но это же копия значения, не понял почему напрямую не хочет.
      Evgenii Legotckoi
      • 23 марта 2018 г. 15:17

      Добрый день!

      Насколько помню, там должно быть преобразование в QVariantList. При передаче данных между C++ и QML происходит неявное преобразование в QVariant или QVariantList. Но оно не всегда происходит, получается. Видимо, что в вашем случае как раз то самое и произошло, потребовалось явное преобразование в QVariant.

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь
        e
        • ehot
        • 31 марта 2024 г. 21:29

        C++ - Тест 003. Условия и циклы

        • Результат:78баллов,
        • Очки рейтинга2
        B

        C++ - Тест 002. Константы

        • Результат:16баллов,
        • Очки рейтинга-10
        B

        C++ - Тест 001. Первая программа и типы данных

        • Результат:46баллов,
        • Очки рейтинга-6
        Последние комментарии
        k
        kmssr9 февраля 2024 г. 2:43
        Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
        АК
        Анатолий Кононенко5 февраля 2024 г. 9:50
        Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
        EVA
        EVA25 декабря 2023 г. 18:30
        Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
        J
        JonnyJo25 декабря 2023 г. 16:38
        Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
        G
        Gvozdik19 декабря 2023 г. 5:01
        Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
        Сейчас обсуждают на форуме
        a
        a_vlasov14 апреля 2024 г. 13:41
        Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
        Павел Дорофеев
        Павел Дорофеев14 апреля 2024 г. 9:35
        QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
        f
        fastrex4 апреля 2024 г. 11:47
        Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
        P
        Pisych27 февраля 2023 г. 12:04
        Как получить в массив значения из связанной модели? Спасибо, разобрался:))
        AC
        Alexandru Codreanu19 января 2024 г. 19:57
        QML Обнулить значения SpinBox Доброго времени суток, не могу разобраться с обнулением значение SpinBox находящего в делегате. import QtQuickimport QtQuick.ControlsWindow { width: 640 height: 480 visible: tr…

        Следите за нами в социальных сетях