Aug. 29, 2019, 5:02 a.m.

Development diaries

DBComponents, Qt, Iscander Che, C++

Требования к проекту

Проект реализует базу данных IT-компонентов. Планируется пока три категории: мониторы, медицинские принтеры, системные блоки. Также в функционал базы входит возможность создавать новые категории.

Проект должен состоять из двух функциональных частей – панели администратора и панели пользователя.

Aug. 2, 2019, 2:37 a.m.

Development diaries

Iscander Che, Simple Tracker, C++, Qt

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

Но начнём с того, что атрибутируем исполняемый файл, как это делается в других приложениях: зададим номер версии, наименование продукта, копирайт и иконку исполняемого файла.

July 31, 2019, 3:57 a.m.

Development diaries

Simple Tracker, Qt, Iscander Che, C++

Рассмотрим теперь сервер и клиента.

С вопросами, касающимися общей организации взаимодействия клиента и сервера, можно ознакомиться в этой статье: " Пример использования QLocalServer и QLocalSocket ". Здесь я коснусь лишь моментов, непосредственно связанных с передачей информации по задаче и закрытием задачи.

Сервер

// trackerserver.cpp

TrackerServer::TrackerServer(QWidget* parent)
    : QWidget(parent)
{
    // Задаём имя сервера
    nameServer = "TrackerServer";
    // Устанавливаем размер следующего блока равным нулю
    nextBlockSize = 0;
    ...
}

// Метод создания и запуска сервера
void TrackerServer::createServer()
{
    localServer = new QLocalServer(this);
    // Если сервер не запустить, выдать сообщение и завершить программу
    if(!localServer->listen(nameServer))
    {
        QMessageBox::critical(0,
                              tr("Ошибка сервера"),
                              tr("Невозможно запустить сервер ") + nameServer + ": "
                              + localServer->errorString());
        localServer->close();
        return;
    }
}
...

// Метод создания подключений
void TrackerServer::createConnections()
{
    // Подключение сигнала сервера о новом подключении к обработчику нового подключения
    connect(localServer, &QLocalServer::newConnection, this, &TrackerServer::slotNewConnection);
    ...
}
July 30, 2019, 3:06 a.m.

Development diaries

C++, Qt, Iscander Che, Simple Tracker

Слоты, имеющие отношение непосредственно к серверу, мы рассмотрим в связке с клиентом. Пока же сосредоточимся на тех слотах, которые относятся к управлению проектами и задачами и общих слотах приложения.

Начнём с соединений. Их я вынес в отдельный метод void TrackerServer::createConnections() .

// trackerserver.cpp

// Метод создания подключений
void TrackerServer::createConnections()
{
    // Установка текущего проекта
    connect(projectView, &QListView::clicked, this, &TrackerServer::slotSetCurrentProject);
    connect(projectView, &QListView::activated, this, &TrackerServer::slotSetCurrentProject);

    // Подключение сигнала о смене статуса к обработчику
    connect(statusDelegate, &ComboBoxDelegate::commitData, this, &TrackerServer::slotChangeTaskStatus);

    // Создание новой задачи
    connect(newTaskButton, &QPushButton::clicked, this, &TrackerServer::slotNewTask);

    // Редактирование существующей задачи
    connect(editTaskButton, &QPushButton::clicked, this, &TrackerServer::slotEditTask);
    connect(taskView, &QTableView::doubleClicked, this, &TrackerServer::slotEditTask);

    // Удаление существующей задачи
    connect(deleteTaskButton, &QPushButton::clicked, this, &TrackerServer::slotDeleteTask);

    // Создание нового проекта
    connect(newProjectButton, &QPushButton::clicked, this, &TrackerServer::slotNewProject);

    // Архивация существующего проекта
    connect(archiveProjectButton, &QPushButton::clicked, this, &TrackerServer::slotArchiveProject);

    // Открытие архива проектов
    connect(openArchiveButton, &QPushButton::clicked, this, &TrackerServer::slotOpenArchive);

    // Открытие окна трекера
    connect(actionOpenWindow, &QAction::triggered, this, &TrackerServer::slotOpenTrackerWindow);

    // Открытие окна трекера по двойному клику на иконке в трее
    connect(trayIcon, &QSystemTrayIcon::activated, this, &TrackerServer::slotDoubleClickOpenTrackerWindow);

    // Завершение работы трекера
    connect(actionQuit, &QAction::triggered, qApp, &QApplication::quit);

    // Открытие окна настроек приложения
    connect(actionSettings, &QAction::triggered, this, &TrackerServer::slotOpenSettingsWindow);
}
July 26, 2019, 3:52 a.m.

Development diaries

Simple Tracker, Iscander Che, C++, Qt

Рассмотрим подробно таблицу задач.

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

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

Вначале реализуем делегата, потом займёмся заливкой цветом и запретом редактирования ячеек.

July 24, 2019, 8:56 a.m.

Development diaries

Iscander Che, Simple Tracker, Qt, C++

Теперь подробно рассмотрим внутреннее устройство самого трекера и его графического окружения.

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

Когда я начал работу над проектом, я ещё не знал, как правильно с помощью Qt Desinger установить QSplitter (вот статья, где подробно описано, как это всё-таки можно сделать: https://evileg.com/post/73/ ). Поэтому дизайн окна писал через код. Пришлось потратить вечер, чтобы немного разобраться. И на этот проект я решил писать все окна, в том числе и диалоги, через код. Вначале это было утомительно, но на диалогах стало удобнее: большинство диалогов имеют кнопки ОК и Cancel, и части кода, описывающие сами кнопки, их размещение, сигнально-слотовые соединения и сами слоты можно было спокойно копировать. Конечно, на совсем простеньких диалогах-вопросах можно использовать QMessageBox, но меня огорчил внешний вид итоговых окон. Возможно, надо повозиться с размерами, чтобы фразы отображались красиво, но я не захотел. Зато автоматическое размещение компонентов прямо из кода меня вполне устроило.

July 23, 2019, 3:17 a.m.

Development diaries

Simple Tracker, Qt, Iscander Che, C++

Базу данных я буду реализовывать на SQLite. В базе должно быть размещено две таблицы: для проектов и для задач. Таблицы в базе данных независимы друг от друга. Все переменные для базы данных и таблиц сделаны глобальными для единообразия.

July 15, 2019, 7:32 a.m.

Development diaries

Iscander Che, Simple Tracker, Qt, C++

Общая структура показана ниже.

Наименование проекта я подправил. Но в заголовках статей и метках я всё равно оставлю «Simple tracker», чтобы не было путаницы.

Проект состоит из подпроектов клиентской и серверной части и подпроекта тестирования. Главный файл проекта выглядит так.

TEMPLATE = subdirs

CONFIG   += ordered

SUBDIRS += ICTrackerServer ICTrackerClient tests
July 9, 2019, 7:31 a.m.

Development diaries

Qt, Iscander Che, C++, Simple Tracker

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

Использование Subversion (далее – SVN) для хранения кода продиктовано тем, что кроме исходных текстов программ под SVN заточен самописный набор скриптов для архивации прочих документов.

Проект появился из необходимости отслеживать собственные работы. Анализ аналогов показал, что для использования имеющихся бесплатных трекеров требуется установка и настройка дополнительного программного обеспечения, как то: полноценный веб-сервер и сервер баз данных; Python и некоторое количество дополнительных скриптов. Поскольку мне трекер необходим только для локального контроля собственных работ, такие затраты показались излишними. Кроме того, это необходимая мне практика по программированию.

Donate

Hello, Dear Users of EVILEG!!!

If the site helped you, then support the development of the site financially, please.

You can do it by following ways:

Thank you, Evgenii Legotckoi

p
Feb. 17, 2020, 2:41 p.m.
pstMem

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

  • Result:85points,
  • Rating points6
z
Feb. 17, 2020, 6:02 a.m.
zet

C++ - Test 006. Enumerations

  • Result:80points,
  • Rating points4
z
Feb. 17, 2020, 5:49 a.m.
zet

C++ - Test 001. The first program and data types

  • Result:80points,
  • Rating points4
Last comments
Feb. 17, 2020, 3:22 a.m.
Evgenij Legotskoj

Добрый день. Это кастомный тег, помещается в файл, который находится в каталоге templatetags myapp/ templatetags/ myapp.py
B
Feb. 16, 2020, 1:36 p.m.
BahaMeirman

Добрый вечер! Монжно по подробней о теге get_companion? ссылка не работает.
Feb. 16, 2020, 9:35 a.m.
Evgenij Legotskoj

Добрый день. На GitHub исходники, можете посмотреть в официальном репозитории
B
Feb. 16, 2020, 9:29 a.m.
BahaMeirman

Здравстсвуйте Евгений, непонятно мне где эти исходники найти?
Now discuss on the forum
Feb. 19, 2020, 8:55 a.m.
Mihailll

Можно через сервер сделать
V
Feb. 19, 2020, 7:09 a.m.
Vitali

Да, прямо сходу не заработало, а сейчас просто некогда разбираться, да и я уже решил не использовать в этом приложении WebEngine. Ошибка: WebEngineContext used before QtWebEngine::initialize(…
Feb. 19, 2020, 7:01 a.m.
BlinCT

Просто реально не вижу тут каких то проблем в модели, вот вообще ничего. Но она все равно не отображается, то есть ладно бы если данные бы не появлялись а сама таблица была бы. Так и таблиц…
Feb. 19, 2020, 6:54 a.m.
Mihailll

понятно, думал что дебаг будет стандартно работать. спасибо за помощь!
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB