Виталий Антипов
Виталий Антипов23 марта 2018 г. 20: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 г. 20:31
  • (ред.)

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

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

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

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

      Добрый день!

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

        Комментарии

        Только авторизованные пользователи могут публиковать комментарии.
        Пожалуйста, авторизуйтесь или зарегистрируйтесь
        Ua

        Qt - Тест 001. Сигналы и слоты

        • Результат:84баллов,
        • Очки рейтинга4
        Ua

        Qt - Тест 001. Сигналы и слоты

        • Результат:42баллов,
        • Очки рейтинга-8
        ОК

        Qt - Тест 001. Сигналы и слоты

        • Результат:47баллов,
        • Очки рейтинга-6
        Последние комментарии
        ИМ
        Игорь Максимов22 ноября 2024 г. 21:51
        Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
        Evgenii Legotckoi
        Evgenii Legotckoi31 октября 2024 г. 23:37
        Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
        A
        ALO1ZE19 октября 2024 г. 17:19
        Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
        ИМ
        Игорь Максимов5 октября 2024 г. 16:51
        Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
        d
        dblas55 июля 2024 г. 20:02
        QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
        Сейчас обсуждают на форуме
        f
        firstlunoxod15 февраля 2025 г. 13:46
        Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
        Дмитрий
        Дмитрий3 февраля 2025 г. 16:24
        Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
        NW
        Nayo Wai30 января 2025 г. 19:22
        не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
        n
        nkly3 января 2025 г. 12:52
        Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
        M
        Marsel17 августа 2023 г. 0:26
        OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

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