Создать таблицу в эксель в qt в графическом
Как известно, Qt предлагает разработчикам практически неограниченные возможности для создания интерфейсов. В большинстве случаев, если вы используйте стандартные виджеты, внешний вид вашего приложения (и элементов его интерфейса) будет соответствовать внешнему виду вашей операционной системы. Для этого в Qt есть система так называемых стилей — классов, ответственных за отрисовку стандартных элементов интерфейса. В этой статье мы попробуем создать свой стиль и применить его к простейшему приложению для того, чтобы получить красивую таблицу на основе виджета QTableWidget.
Теоретическая часть
Итак, начнем с теории. В Qt существует абстрактный класс QStyle, ответственный, как не сложно догадаться, за стилизацию приложения. От него унаследовано некоторое количество классов (QWindowStyle, QMacStyle и т.д.), которые представляют собой стили, эмулирующие стандартный внешний вид операционной системы. Мы будем делать свой стиль для приложения по их образу и подобию. Qt требует, чтобы пользовательские стили были унаследованы не напрямую от QStyle, а от одного из его классов-наследников. Документация рекомендует выбрать наиболее близкий к желаемому системный стиль, и изменить его «под себя». Мы же будем наследовать наш класс от не менее абстрактного, чем QStyle, класса QCommonStyle.
Как же происходит рисование элементов внутри стиля? Класс QStyle имеет набор функций, названия которых начинаются со слова draw:
- drawComplexControl()
- drawControl()
- drawItemPixmap()
- drawItemText()
- drawPrimitive()
Каждая из них делает свою небольшую часть работы по отрисовке элементов.
drawComplexControl() используется для рисования составных виджетов, то есть таких, которые содержат в самих себе несколько других виджетов.
В качестве примера можно привести QSpinBox, который, как несложно догадаться, реализует обычный SpinBox и состоит из поля ввода и двух маленьких кнопок:
drawControl() рисует стандартные виджеты вроде кнопок и полей ввода.
drawPrimitive() рисует так называемые примитивные элементы, например, рамки.
drawItemPixmap() и drawItemText() имеют вполне говорящие названия и делают именно то, что вы могли бы от них ожидать. Детальные описание всех функций, а также их аргументов, можно очень легко найти в документации Qt, поэтому я на этом останавливаться не буду.
В нашем примере, мы будем делать стиль для элемента QTableWidget, который представляет собой обыкновенную таблицу. Стили для остальных элементов делаются абсолютно аналогично.
Начинаем
Первым делом, создадим новый класс С++. При создании класса, Qt услужливо предлагает нам написать его название, а так же название класса, от которого мы хотим наследовать. Назовем его для простоты myStyle, и укажем наследование от QCommonStyle. После этого, Qt создаст нам пару файлов (.h и .cpp), в которых, для начала, мы хотим получить примерно такую заготовку:
Наша функция main() будет выглядеть следующим образом:
Как видите, все что мы делаем — это устанавливаем наш стиль, создаем виджет и отображаем его. На данном этапе у нас есть только пустой стиль, унаследованный от QCommonStyle, поэтому наша таблица будет выглядеть… ну, скажем, не очень привлекательно:
Рассмотрим подробнее из чего состоит таблица.
Структура, в общем, довольно простая и понятная. Стоит разве что остановиться на секунду на заголовках. В Qt разделяют два вида заголовков: горизонтальный (тот, который сверху), и вертикальный (тот, который слева). Под «Областью заголовка» я подразумеваю всю область, на которой впоследствии будет отображен заголовок. Секция — это каждая конкретная ячейка заголовка. Незанятая область — это та часть заголовка, на которой секций нет (это случается, когда суммарный размер всех секций меньше размера таблицы).
Итак, вооружившись этими знаниями, можно стилизовать каждый элемент. Начнем с добавления в наш класс функций
Начнем с функции drawControl(). Добавим в реализацию код:
Ключевой атрибут этой функции — это element, который указывает на тип того, что мы будем рисовать. Внутри switch'a мы будем добавлять по case'у для каждого из тех элементов, которые мы будем рисовать сами. Все остальные будут обрабатываться в default-секции с помощью аналогичной функции родительского класса.
Начнем с рамки, которая окружает нашу таблицу целиком. Я буду делать градиентную рамку. Верхняя и нижняя границы будут белыми, а вертикальные границы будут нарисованы градиентом: они будут белыми по краям и светло-серыми в середине.
Для этого добавим в функцию drawControl() следующий код:
Итак, что же здесь происходит. Сначала мы создаем линейный градиент, направленный сверху вниз. Затем мы задаем цвета для ключевых точек, которых у нас три: начало, конец и середина. Как я уже говорил, начало и конец мы делаем белыми, а середину чуть сероватой.
После этого мы создаем перо и устанавливаем в него наш градиент. Перо в Qt рисует с помощью кисти (QBrush), в роли которой будет выступать градиент. Наконец, функцией drawRect() мы рисуем нашу рамку.
Теперь приступим к заголовкам. Саму область заголовка (CE_Header) нам обрабатывать не нужно. Мы займемся секциями и пустой областью. С пустой областью все очень просто, мы закрасим ее однотонным серым цветом:
С секциями же придется несколько сложнее. Как мы знаем, если на заголовок таблицы нажать, то выделится либо вся строка, либо весь столбец (в зависимости от того, куда мы нажали). При этом заголовок поменяет свой внешний вид, чтобы пользователь видел изменение его состояния. Обычно заголовок либо «вдавливается», либо подкрашивается. Мы хотим сохранить эту функциональность. Более того, хотелось бы, чтобы при выделении ячейки или ячеек, соответствующие заголовки также окрашивались.
Итак, добавим следующий код:
Итак, секция может быть в двух состояниях: активном и неактивном. Для того, чтобы определить это, мы проверяем ее флаги. Флаг State_Sunken показывает, что секция нажата, а флаг State_On показывает, что выбрана ячейка, принадлежащая столбцу (или строке) этой секции. Если хотя бы один из них установлен, мы закрашиваем секцию ровным оранжевым цветом, а также рисуем для нее целиковую границу для того, чтобы оранжевая секция не смотрелась грубо на фоне других (не выделенных) светло-серых частей заголовка.
Если секция неактивна, мы закрашиваем ее градиентом от белого до светло-серого цвета и рисуем границу. Я решил рисовать только вертикальные границы секций, поэтому все что мне нужно — это изобразить вертикальную полоску справа от каждой секции. Чтобы полоски не смотрелись грубо, мы нарисуем их градиентом почти так же, как и рамку всей таблицы: концы полосок будут более светлыми, а середина — более темной. Для этого мы перенастраиваем градиент и устанавливаем его в перо, которым будет рисоваться полоса.
На данном этапе мы получили довольно симпатичный заголовок. Однако при выделении наши ячейки по-прежнему закрашиваются довольно некрасивым цветом по умолчанию. К тому же, стандартная фокусная рамка тоже выглядит не слишком красиво.
За отрисовку ячеек отвечает атрибут CE_ItemViewItem. Добавим в него следующий код:
Здесь нам пришлось сделать гораздо больше. Во-первых, за раскраску выделенных ячеек другим цветом отвечает элемент PE_PanelItemViewItem, который рисуется в функции drawPrimitive(). Поэтому мы должны вызвать эту функцию, передав туда имеющиеся у нас параметры. После этого мы преобразовываем указатель на опции с базового класса QStyleOption в нужный нам класс QStyleOptionViewItemV4. Это нужно, помимо прочего, для получения текста и области рисования этого текста.
Если ячейка, которую мы рисуем, является выделенной то мы рисуем небольшую серую рамку вокруг всей ячейки.
После этого мы получаем размер области, на которой должен бын выведен текст, и делаем небольшой отступ, чтобы текст не появился вплотную к левому верхнему краю. Наконец, мы рисуем текст функцией drawText().
Поскольку при обработки ячеек мы вызываем функцию drawPrimitive для элемента PE_PanelItemViewItem, реализуем отрисовку этого элмента, чтобы выделенные ячейки раскрашивались в какой-нибудь более приятный цвет.
По аналогии с drawControl(), добавим в drawPrimitive() точно такой же switch, и сразу реализуем нужную нам подсветку ячеек:
Наконец, изменим шрифт, которым будет выводиться текст. Добавим в функцию drawItemText() следующий код:
Итак, мы преобразили невзрачную табличку, и теперь она выглядит так:
что на мой взгляд гораздо лучше того, что было изначально.
Преимущества данного подхода
Конечно, создавать стили для всего приложения таким образом — весьма трудоемкая задача. Стиль для одного элемента (как в этой статье) можно сделать очень быстро, но если вы хотите позаботится о всех виджетах (например если вы хотите распространять свой стиль, чтобы другие люди могли им воспользоваться), это может отнять достаточно много времени. Описание элементов, которые должны быть нарисованы для каждого отдельно взятого виджета, я, к примеру, не нашел, и мне пришлось определять их методом «научного тыка». Однако у стилизации таким образом есть ряд существенных преимуществ.
Во-первых, эти стили применяются ко всем элементам. Если у вас есть 300таблиц, то вам не нужно настраивать каждую вручную, стиль к приложению применяется в одну строку.
Во-вторых, стили, созданные таким образом, удобно менять. Это, пожалуй, лучший способ предоставить пользователю возможность изменить стиль приложения через настройки. К тому же, вы можете быть точно уверены, что созданный вами стиль будет каждый раз выглядеть одинаково.
В предыдущей части я рассказывал о создании модуля для запуска SQL-запросов и оболочки, в которой эти модули запускаются. После недолгой работы с запросами возникает очевидный вопрос — а как воспользоваться результатом выборки, кроме как посмотреть на экране?
Для этого стоит сделать дополнительные инструменты экспорта и копирования данных. Экспортировать будем в файл в формате Excel, а копировать в системный буфер в формате HTML.
Но для начала прилепим к нашему главному окну панель инструментов.
Панель инструментов
Напомню, что наше приложение призвано быть простым, универсальным и расширяемым. Чтобы тулбар тоже сделать универсальным и расширяемым, вынесем его определение в файл конфигурации, а выполняемые функции будут находиться во внешних модулях, явно не импортируемых в модуле тулбара. Таким образом добавление новой кнопки и функции сведется к прописыванию их в конфигурационном файле и добавлению модуля в каталог программы.
Для панелей инструментов в Qt есть готовый класс QToolBar, от него породим свой ToolBar. Сейчас нам достаточно одного тулбара, но заложимся на возможность добавления в программу нескольких панелей. Каждой панели нужен свой конфигурационный файл со своим набором кнопок, поэтому имя файла будем передавать параметром при создании тулбара.
Конфигурационный файл будет традиционно в формате Ini и кодировке UTF-8.
Синтаксис определения кнопок в наших руках, в простейшем случае нам нужны три вещи:
— текст на кнопке
— модуль, содержащий функцию кнопки
— функция кнопки
Определимся, что функция кнопки принимает один параметр — текущее дочернее окно. Что именно будет делать модуль с ним — задача модуля кнопки, а задача тулбара ограничивается только его вызовом.
Создадим такой файл tools.ini:
Теперь в питоне разбираем определения из Ini-файла:
Метод выполнения, назначенный всем кнопкам, будет импортировать нужный модуль и вызывать из него назначенную кнопке функцию. Чтобы нам не прописывать каждый модуль в перечне импорта тулбара, воспользуемся библиотекой importlib. Осталось только узнать, что за кнопка была нажата и от какого QAction пришел сигнал — за это отвечает стандартный метод QObject.sender(), далее возьмем сохраненные в нем параметры и сделаем то, что задумано в модуле (что бы это ни было).
Осталось добавить нашу панель в наше главное окно (модуль tasktree.py)
Можем запустить и проверить, появилась ли панель:
Может быть не так симпатично, как на первой картинке, главное, что работает.
Модуль функций инструментов
Теперь самое время сделать модуль с функциями кнопок. Модуль у нас будет один, потому что функции экспорта и копирования будут работать с одним источником данных и по одинаковым правилам, нет смысла разносить их по разным модулям.
Наши функции будут работать с таблицами данных QTableView, который мы использовали в модулях для просмотра результатов запроса. Чтобы сохранить независимость модулей, определять нужный компонент будем «на лету» — либо это текущий выбранный (focused) компонент QTableView в текущем окне, либо первый попавшийся нужного класса среди дочерних элементов текущего окна.
Из таблицы получаем список выбранных ячеек. Если ничего не выбрано, то принудительно выбираем всё.
Наверное, вы уже в курсе, что в Qt вы не получаете массив данных напрямую, вместо этого вы работаете с индексами в модели. Индекс QModelIndex представляет собой простую структуру и указывает на конкретную позицию данных (строку row() и столбец column(), а в иерархии указание на индекс родителя parent()). Получив индекс, можно из него получить сами данные методом data().
Мы получили список индексов выбранных ячеек в модели, но индексы в этом списке следуют в том порядке, в котором пользователь их выделял, а не отсортированные по строкам и столбцам. Нам же удобнее будет работать не со списком, а с словарем (позиция → индекс) и сортированными списками задействованных строк и столбцов.
Еще стоит учесть, что QTableView по умолчанию позволяет выделять несвязанные ячейки, потому в списке индексов могут быть ячейки, практически случайно расположенные:
Поэтому в d.rows есть каждая использованная строка, в d.columns есть каждый использованный столбец, но их сочетание необязательно есть в d.indexes.
Еще нам для пущей красоты нужен перечень наименований столбцов, который выводятся в QTableView. Получим их из модели методом headerData:
До сих пор код для экспорта и копирования был одинаковым, но теперь пошли различия.
Экспорт в Excel
Для экспорта в файлы Excel я воспользовался пакетом xlsxwriter. Он устанавливается, как обычно, через pip:
Документация пакета вполне подробная и понятная, с примерами, поэтому останавливаться на нем не буду. Суть в том, что запись идет по ячейкам, адресуемым по номеру строки и столбца. Если нужно дополнительное форматирование, то нужно определить стиль и указывать его при записи ячейки.
Имя xlsx-файла, в который будем экспортировать, запросим у пользователя, у Qt есть такая функция. В PyQt функция возвращает список из выбранного имени файла и использованного фильтра. Если вернулся список из пустых строк, то это означает, что пользователь отказался от выбора.
Танцы вокруг QDateTime добавлены из-за разного понимания даты/времени в Python, Qt и Excel — во-первых, пакет xlsxwriter умеет работать с питоновским datetime, но не умеет с QDateTime из Qt, поэтому приходится дополнительно его конвертировать специальной функцией toPyDateTime; во-вторых, Excel умеет работать только с датами с 01.01.1900, а всё, что было до этого времени для Excel — просто строка.
Результат экспорта в Excel:
Копирование в системный буфер в формате HTML
Не всегда нужен отдельный файл с выборкой, часто, особенно когда данных немного, удобнее скопировать их в табличном виде в системный буфер (clipboard), а затем вставить в нужное место, будь то Excel, Word, редактор веб-страниц или что-то другое.
Наиболее универсальным способом копирования табличных данных через буфер — это обычный формат HTML. В Windows, *nix и MacOS сильно разные способы работы с буфером (не говоря о том, что их несколько), поэтому хорошо, что Qt скрывает от нас детали реализации.
Всё, что нам нужно — создать объект QMimeData, заполнить его через метод setHtml фрагментом HTML-разметки, и отдать в системный clipboard, который доступен через QApplication
Таблицу собираем построчно, начиная с заголовков.
Результат, вставленный в Word:
Здесь границы таблицы видны только благодаря включенной в Word настройке "Показывать границы текста", на самом деле они невидимы. Чтобы таблица копировалась с явными границами, нужно изменить стиль таблицы в тэге table. Предоставляю это сделать вам.
Заключение
Итак, мы получили способ добавления в наш инструмент новых функций, причем функции добавляются и работают независимо от того, какими источниками данных мы будем пользоваться и как их отображать — модули, работающие с данными, ничего не знают о тулбарах и их функциях, тулбары не связаны ни с модулями данных, ни с функциями кнопок, а функции кнопок, не зная ни о тулбарах, ни о модулях данных, просто пытаются обработать текущий визуальный компонент известным им способом.
Исходники, использованные в примерах, как и ранее, выложены на github под лицензией MIT.
Qwt – графическая библиотека, позволяющая значительно упростить процесс визуализации данных в программе. Упрощение заключается в следующем: нет необходимости вручную прописывать элементы отображения, такие как шкалы координат, сетки, кривые данных и проч. Следует лишь задавать параметры этих элементов.
Аналогия: для того, чтобы построить график в Excel Вы выбираете данные и настраиваете параметры их отображения: минимум и максимум шкал, цвет кривых, подписи данных и др. За визуализацию отвечает Excel – сами элементы Вы не программируете.
Особо отмечу, что Qwt позволяет работать с достаточно большими объемами данных (я работал с 200 000 точек) без возникновения раздражающих «тормозов».
В данной статье мы будем отображать кривую на графике, масштабировать ее, перемещаться по графику, смотреть координаты курсора. Таким образом, мы реализуем минимальный функционал, необходимый для вывода и просмотра графиков. В последующих статьях наш графический редактор будет оснащен дополнительными возможностями.
Подобные инструкции в интернете, конечно, есть. Но их очень немного. В большом количестве присутствует информация по решению различных проблем с Qwt, которая полезна лишь тем программистам, которые уже имеют прочные базовые навыки работы с библиотекой. В данной статье я собрал разрозненные кусочки примеров кода, позволяющего создать простейший визуализатор графиков.
Приступим же.
Этап 1: подключение Qwt к Qt Creator
(проверено для ОС Win 7 x64 и Win 8.1 x64).
Этап 2: использование библиотеки Qwt.
Шаг 1: подготовка среды.
- Создать в Qt Creator проект Qt Widgets Application (класс на базе QMainWindow). Имя моего проекта было: «Qwt_howTo».
- Найти в дереве файлов проекта файл c расширением «.pro» и добавить снизу строчку «CONFIG += qwt» (здесь и далее кавычки не являются частью синтаксиса и используются лишь для удобства чтения).
- Правой кнопкой мыши на корневую папку с именем проекта и выбрать «Запустить qmake».
Действия 2 и 3 следует выполнять для каждого проекта, в котором предполагается использовать библиотеку Qwt.
Шаг 2: реализация возможностей Qwt.
Файл main.cpp оставляем неизменным. В данном примере код будет написан в файле mainwindow.cpp. Это не совсем элегантно, но приемлемо в качестве примера.
1. Добавляем в начало файла mainwindow.cpp следующие строки:
Если эти headers у вас подчеркиваются с надписью «Файл не найден», значит, вы не выполнили п.3 шага 1.
2. Теперь код будем писать только в конструкторе MainWindow. Можно было бы разбить код на методы, но в рамках обучающего примера я не стал этого делать.
Создаем основное поле графика:
Компилируем, запускаем и видим не очень-то привелекательную картинку:
Запускаем. Пробуем развернуть окно на весь экран, поле графика тоже развернется на весь экран с соответствующим масштабированием. Неплохо!
3. Приукрасим поле, добавив следующие строчки кода:
Результат запуска (поле уже смотрится достаточно симпатично):
4. Добавим график
Результат:
Отмечу, что минимум и максимум осей определяется автоматически. Это приятный сюрприз! Конечно, можно задавать эти значения вручную, например, вот такой строчкой:
5. Все это хорошо, но мы-то привыкли, что есть возможность приближения/удаления графика а также перемещения по его полю. Не проблема! Всего несколько строк, и этот функционал появляется в нашем редакторе:
Масштабируем и перемещаем:
6. Напоследок активируем возможность определения координат курсора:
Выводы:
Совсем немного кодирования, в основном заключающегося в настройках внешнего вида просмотрщика, и у нас реализован базовый функционал.
Что дальше? Если будет проявлен интерес к данной теме, то в следующих статьях я могу рассказать о том, как:
1. Отображать координаты курсора в строке состояния, а также сохранять эти координаты в отдельных переменных.
2. По клику мышкой ставить точки в области расположения курсора.
3. Добавлять управляющие кнопки и кое-что еще.
P.S: в папке «C:\qwt-6.1-rc3\examples» располагается исходный код и .exe файлы множества интересных примеров применения Qwt. Код без комментариев.
Просмотр профиля
Репутация: 0
На работе меня настигла следующая задача:
Есть много-много файлов excel одинаковой структуры. Необходимо собрать данные с итогов всех таблиц, просуммировать и занести в другой файл excel (в конечную таблицу), которым потом пользователь сможет манипулировать. Также необходимо вывести некоторые данные, но для них нет определенной таблицы, и диаграммы. Необходимости в отображении файлов с исходными данными, в принципе, нет, интересуют только итоговые таблицы.
Вроде, задача и не самая сложная, но, учитывая мой крайне небогатый опыт в программировании, меня поставила в некоторый тупик.
Для начала, не могу сообразить, как мне выбрать несколько excel файлов и просуммировать итоги.
Буду рад дельному совету (если возможно, с примером кода), ибо, как обычно это в России бывает, "результат нужен был вчера".
опции профиля:
Просмотр профиля
Репутация: 0
На самом деле задача не сложная, при условии одинаковой структуры таблиц во всех файлах!
1. Открываешь файл
2. Пока не конец файла считываешь строку
3. Разбиваешь строку на части по разделителю (чаще всего это ";")
4. Заносишь каждую часть в переменную (суммируешь и т.д.)
5. Открываешь следующий файл (к пункту 1)
6. Открываешь для записи новый файл
7. Заносишь в строку через ";" свои данные и записываешь строку в файл
P.S.: Это алгоритм работы с данными, как нарисовать линии таблиц и т.п. я к сожалению не знаю
вот код по считыванию данных
опции профиля:
Дали задание сделать подключаемую базу данных. Решил что удобнее будет в Excel. База данных с параметрами объектов к которым надо будет обращаться. Она подключается также как и написанная в Qt или как-то по другому? Ну а обращение к элементам одинаково?
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
Подписчики
Вообще, назвать документ Excel базой данных у меня как-то язык не поворачивается.
Это же файл с таблицами, в которых используются разделители определённых типов, например точка с запятой. Наиболее простым вариантом такого формат является формат CSV.
На сайте имеется урок по работе с CSV в Qt, можете там посмотреть, как с ним работать.
А вообще с файлами Excel в Qt всё печально. Это же по сути проприетарный формат и Qt не занимается его поддержкой. Поэтому готовых классов по работе с файлами Excel в Qt нет. Необходимо либо парсить файл Excel и разбирать его до основания, либо найти стороннюю библиотеку, которая даст весь необходимый для работы функционал.
А если Вы имели ввиду работу, например как, через QSqlDatabase, то вы ошиблись. Здесь механика работы совершенно различна.
Т.е. я могу заполнить базу в Еxcel,сохранить ее формате csv (разделители-запятые) и подключить к проекту. Тогда обращаться к объектам как в Qsqldatabase я несмогу. Поэтому у меня возникают вопросы, как подключить такую базу и как оперировать с ее элементами? Спасибо!
При сохранении в CSV скорее всего все связи и настройки будут утеряны.
CSV является простейшим форматом. Если нужна сортировка, связи таблиц и прочие настройки, которые сделаете в Excel, то нужно будет всё-таки разбираться с форматом Excel и парсить его, но это довольно нетривиальная задача.
Так что наиболее логичным будет поискать готовые решения по работе с Excel файлами.
Впрочем, кажется я немного ошибся. Можно попробовать подключить файл с помощью драйвера QODBC. Вот ссылка Обработка Microsoft Excel в Qt
Там же есть список готовых библиотек.
Спасибо, попробую реализовать.
Но если использовать Excel просто для составления самой простой таблицы, без связей и настроек, то при сохранении в csv все останется рабочим. Если делать так то должно работать? Если да, то вопрос еще актуален.
Если использовать Excel просто для составления таблицы и сохранить его в CSV, то можно делать что-то вроде импорта документа в программу и распарсить его, разбирая на нужные объекты. Например, одна строка – это один объект. Поля объекта (то есть переменные), будут соответствовать полям таблицы в строке (то есть колонкам).
Если посмотрите внимательно урок по CSV, который я привёл выше, то увидите, что там идёт довольно простое формирование ячеек таблицы. Символ ‘;’ служит для разделения колонок, а перевод строки ‘\n’ соответственно разделяет строки.
Соответственно распарсить такой файл, прочитав его построчно, не должно составить большого труда.
Когда сохраните файл, то откройте его обычным блокнотом, и станет сразу ясна структура документа.
Незнаю как будет удобнее: считывать из файла нужную строку и находить в ней нужный столбец, или же переписать файл csv в создаваемую базу данных QSQLite и непосредственно к ней уже обращаться. Но в любом случае не знаю как обратиться и считать нужную строку csv (например 2). Мне кажется 2 вариант удобнее. Прошу помочь с реализацией
Вечером накидаю небольшой набросок возможного варианта.
Данные из CSV файла необходимо считывать построчно. Поскольку это формат данных, разделённых точкой запятой, и каждая строка закрывается последовательностью \r\n, как правило. А далее, чтобы отобразить данные в таблице в приложении на Qt, необходимо воспользоваться QStandardItemModel и QTableView, переписывая данные в соответствующие ячейки.
Например, создали таблицу в Excel следующего вида:
Чтобы получить следующий результат:
У меня код получился следующий, для извлечения данных из csv файла, который хранится в файле ресурсов (для того, чтобы взять другой внешний файл, нужно только правильно указать путь к нему)
mainwindow.h
mainwindow.cpp
А что касается добавления данных в базу данных SQLite, то посмотрите следующие уроки, в них навалом примеров по добавлению данных в базу данных SQLite:
Пытался засунуть я данные в базу, однако не получается. Пишет ” Parameter count mismatch” .Подскажите что не так.
Ничего другого не придумал как переписать файл csv в массив, а потом хотел с него в базу записать.
Проект скинуть не могу ввиду требований секретности (армия). На ПК ни интернета, ни переводчика.
1-я Ошибка – это получается скорее массив из одного элемента. А если учесть, что он статический, то в него непонятно, что записывается. Чтобы работать с массивом, нужно знать заранее его длину. То есть длина должна быть равна количеству элементов, которое в него будет записано. Ну тут я ничем помочь не могу. Вам нужно почитать про массивы какую-нибудь литературу по C++, по его основам. Кто-то на эту тему советует Страуструпа, кто-то Лафоре. Авторов много.
2-я Ошибка – в методе, где создаётся база данных. Опять же, почитать про SQLite, а точнее про типы данных. А также про основы создания таблиц в SQL. У Вас там одни только типы данных перечислены и не более того. Нет названий колонок.
3-я Ошибка – в методе, где добавляется запись. Та же самая ерунда, отсутствуют названия колонок. В моих примерах они присутствовали. Вы их удалили.
Рекомендую почитать дополнительно про типы данных в SQL и массивы. То, как Вы создали массив, приведёт к созданию массива с одним элементом. Тут нужно дополнительно восполнять пробелы в знаниях чтением профильной литературы.
Рекомендую заменить на QList. В него помещать ваш собственный класс или структуру, которая будет содержать элементы i и j.
Комментарии
Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Читайте также: