Разработка Для Sailfish Os: Таймеры И Реализация Экспорта В Файл На Примере Приложения Для Ведения Списка Дел

Мы уже писали об опыте разработки наше первое приложение для мобильной платформы Sailfish OS .

Но они решили не останавливаться на достигнутом и сразу взялись за второй.

Целью было создать приложение, с помощью которого пользователь мог бы отслеживать свое рабочее время, планировать задачи и предоставлять информацию о проделанной работе, иными словами, разработать персональный мобильный трекер времени.



Описание приложения

Приложение, естественно, должно иметь возможность вести журнал задач с возможностью экономии затраченного на них времени.

Хотелось бы, чтобы время можно было измерять с помощью встроенного таймера, а не просто писать от руки.

Кроме того, планировалось создавать текстовые отчеты о проделанной работе в виде таблиц, а затем отправлять их работодателю.

Поскольку разработка самой структуры приложения и его интерфейса уже была описана в предыдущих статьях цикла разработки для Sailfish OS (можно проследить путь от начала разработки до создания первого приложения Здесь И здесь ), то в этой статье будет описан только тот функционал, который отличается от реализованного ранее и наиболее интересен с точки зрения его реализации.

В нашем приложении это таймеры задач и экспорт списка задач.



Таймер

Для измерения продолжительности заданий приложение использует механизм таймера.

Процесс синхронизации осуществляется с помощью стандартного элемента Qt Timer, который имеет интервал обновления 1000 миллисекунд.

  
  
  
   

Timer { id: stopwatch interval: 1000 repeat: true running: true triggeredOnStart: true onTriggered: { if (timerActive) { var currentTime = new Date (); var differeceInTime = (currentTime.getTime() - previousTime.getTime()); previousTime = currentTime; updateData(differentInTime); } } } function updateData(usec) { elapsedTime += usec; taskTimerString = getTimeString(elapsedTime); }

Каждый раз, когда происходит событие onTriggered в Таймер Время таймера рассчитывается: время предыдущей операции вычитается из текущего времени.

Такая реализация удобна тем, что при выходе устройства из неактивного режима время будет обновляться корректно.

Кнопки сделаны для управления таймером.

Начинать И Перезагрузить .

Также возможно приостановить активный таймер.

Чтобы сохранить измеренное время, просто нажмите кнопку Экономьте время , доступный в раскрывающемся меню.

Счетчик таймера будет автоматически добавлен к текущему времени, потраченному на задачу.



Разработка для Sailfish OS: таймеры и реализация экспорта в файл на примере приложения для ведения списка дел

Если пользователь попытается запустить новый таймер, пока активен старый, появится диалоговое окно с возможностью выбрать, что делать со старым таймером: сбросить данные старого таймера и запустить новый, сохранить данные старого таймера.

и начать новый, перейти к старому таймеру.



Разработка для Sailfish OS: таймеры и реализация экспорта в файл на примере приложения для ведения списка дел

Также, если таймер активен, он отображается на обложке приложения.



Ээкспортировать отчеты



Разработка для Sailfish OS: таймеры и реализация экспорта в файл на примере приложения для ведения списка дел

Приложение также включает в себя функцию отчетности.

Отчет представляет собой таблицу, содержащую информацию обо всех задачах, хранящихся в приложении.

В таблице фиксируются даты начала и окончания задачи, ее название и описание, статус задачи и затраченное на нее время.

Список задач берется непосредственно из базы данных, при этом задачи выбираются из диапазона, который указывает сам пользователь на экране отчетности.



function selectByPeriod(beginning, end) { var database = getDatabase(); queryResult.clear(); database.transaction(function(transaction) { var tasks = transaction.executeSql('SELECT * FROM tasks WHERE startDate >= ? AND finishDate <= ?', [beginning, end]); for (var i = 0; i < tasks.rows.length; i++) { var element = tasks.rows.item(i); var startDate = new Date (element.startDate); var finishDate = new Date (element.finishDate); convertDateToUTC(startDate); convertDateToUTC(finishDate); var idDone = element.taskDone === 0 ? false : true queryResult.append({"startDate": startDate, "finishDate": finishDate, "taskName": element.taskName, "taskDescription": element.taskDescription, "taskDone": isDone, "spentTime": element.spentTime}); } }) }

Записывать отчеты можно в два типа файлов: csv и html. Формат исходного файла также выбирается на экране формирования отчета.

Для каждого типа реализован класс C++, отвечающий за создание соответствующего файла.

Запись в файлы csv осуществляется с использованием текстового потока.

QTextStream .

Для корректного отображения кириллицы используется кодировка Windows-1251.

Q_INVOKABLE void writeLine(QVariantList taskInfo) { QTextCodec *utf8 = QTextCodec::codecForName("Windows-1251"); QTextStream stream(&csvFile); QStringList line; stream.setCodec(utf8); for(int i = 0; i < taskInfo.size(); i++) { line << taskInfo[i].

toString(); } stream << line.join(",") << endl; }

Отчеты HTML создаются с использованием класса QTextDocument. Для создания таблицы с информацией по задачам используется класс QTextTable. Он позволяет задать стиль таблицы и текста в ней.



Q_INVOKABLE void createDocument(int rows, QVariantList columns) { report = new QTextDocument(); QTextCursor cursor(report); table = cursor.insertTable(rows + 1, columns.length()); QTextCharFormat format; format.setFontWeight(QFont::Bold); QTextCharFormat cellFormat; cellFormat.setBackground(QBrush(Qt::cyan)); for(int col = 0; col < table->columns(); col++) { QTextTableCell cell = table->cellAt(0, col); QTextCursor cellCursor = cell.firstCursorPosition(); cell.setFormat(cellFormat); cellCursor.mergeCharFormat(format); cellCursor.insertText(columns[col].

toString()); } QTextTableFormat tableFormat = cursor.currentTable()->format(); tableFormat.setCellSpacing(0); table->setFormat(tableFormat); } Q_INVOKABLE void addRow(int row, QVariantList taskInfo) { QTextCharFormat cellFormat; cellFormat.setBackground(QBrush(Qt::darkCyan)); for(int col = 0; col < table->columns(); col++) { QTextTableCell cell = table->cellAt(row, col); QTextCursor cellCursor = cell.firstCursorPosition(); cellCursor.insertText(taskInfo[col].

toString()); } QTextTableCell indexCell = table->cellAt(row, 0); indexCell.setFormat(cellFormat); }



Заключение

В результате получилось приложение с понятным и простым интерфейсом, позволяющим легко вести и отслеживать список дел.

Из ранее незапланированного функционала мы добавили возможность фильтровать задачи по статусу выполнения, чтобы можно было отфильтровать завершенные.

Приложение было опубликовано в магазине приложений Jolla Harbour под названием Report Card и доступно для скачивания любому желающему.

Исходники приложения доступны по адресу GitHub .

Автор: Максим Костерин Теги: #sailfish os #qml #Qt #разработка мобильных устройств #Разработка мобильных приложений #Qt #Разработка для Sailfish OS

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.