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 29, 2019, 2:57 a.m.

Algorithms

Дерево, Алгоритм, Tree

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

July 26, 2019, 11:47 a.m.

Development diaries

лытдыбр, Qt, C++

Когда в четвёртый раз в одном месте написал нечто подобное:

QStringList list;

// наполняем list по условию, т.е. элементов там может и не оказаться

if(!list.isEmpty())
{
    foreach(QString str, list)
    {
        // обходим каждый найденный элемент
    }
}

неожиданно осознал, для чего бывают итераторы.

Не то, чтобы какое-нибудь открытие. Про итераторы я знаю. Только до сегодняшнего дня в голову не приходило их использовать. Всегда хватало foreach , или на совсем уж крайний случай for , когда надо в обработке надо опираться на идентификатор элемента списка. И получилось красивее:

QListIterator<QString> listIterator(list);

while(listIterator.hasNext())
{
    // обрабатываем элементы списка, если они есть
}

Жаль, что нельзя из итератора извлечь идентификатор элемента...

July 26, 2019, 3:52 a.m.

Development diaries

Simple Tracker, Iscander Che, C++, Qt

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

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

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

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

July 25, 2019, 4 a.m.

Algorithms

Дерево, Алгоритм, Tree

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

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 22, 2019, 11:57 a.m.

Development diaries

QTableWidgetItem, QAction, QTableWidget, QDialog

Диалог редактирование справочника пользователей

В форме mainwindow.ui добавляем пункт меню Пользователи которому соответвует объект actionUsers. Назначаем ему значок и горячую клавишу.
Создаем Класс формы Qt Designer с именем UsersDialog.
В слоте MainWindow::on_actionUsers_triggered() реализуем вызов диалога Пользователи.

July 21, 2019, 2:58 a.m.

Development diaries

trigger, QStatusBar, SQLite, QMenu, QAction

Хранение информации о текущем пользователе

После открытия главного окна приложения хотелось бы чтобы в строке состояния отображалось имя текущего пользователя и информация о подключении к центральной базе данных.
Также хотелось ограничить права пользователя на некоторые действия. Т.е. пользователю с usder_id отличным от 1 было доступен урезанный функционал приложения.
Для хранения id текущего пользователя добавить опцию 1020. Для этого в метод DataBases::connectOptions() добавим еще один запрос жля создания опции.

listSQL << "INSERT INTO `options`(`option_id`,`value`,`comment`) VALUES (1020, '1', 'Текущий пользователь системы')";
Looking for a Job?
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

For registered users on the site there is a minimum amount of advertising

DSh
Sept. 21, 2019, 2:55 p.m.
Dmitrij Shilkov

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

  • Result:46points,
  • Rating points-6
s
Sept. 18, 2019, 5:19 p.m.
sanyalitv

C++ - Test 002. Constants

  • Result:33points,
  • Rating points-10
s
Sept. 18, 2019, 5:12 p.m.
sanyalitv

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

  • Result:80points,
  • Rating points4
Last comments
M
Sept. 20, 2019, 11:25 a.m.
Mark

вызываю метод get у m_downloader в другом методе и приложение начинает вылетать. В чем ошибка?
M
Sept. 19, 2019, 5:45 a.m.
Mark

А вот как выгрузить файл на сервер по http протоколу? Допустим на regRu. И как получить путь файла, которой отображается в файловом менеджере regRu, чтобы загрузить его.
Sept. 17, 2019, 6:07 a.m.
Misha Lebedev

Кстати интересные темы нашёл тут https://emacsway.github.io/ru/django-framework/#django-models Может что полезного тоже Евгений найдёте
Sept. 17, 2019, 4:50 a.m.
Misha Lebedev

Доброго времени суток. Спасибо за хороший ответ, У меня ситуация така что в галлереи будет несколько миллионов фотографий с фильтрами и тегами , и я опасаюсь за производительност . Это ос…
Sept. 17, 2019, 3:23 a.m.
Evgenij Legotskoj

Добрый день. Да, я тоже читал ту статью в своё время и согласен с тем, что внешние ключи гораздо лучше, чем GenericForeignKey. Выборки в ряде случае работают быстрее. Но лично мне про…
Now discuss on the forum
M
Sept. 22, 2019, 1:54 a.m.
Mark

Пока реализовал так: на сервере лежат сами файлы и файл с именами всех файлов и их версий, который админ обновляет при довавлении файла. Клиентское по парсит этот файл и таким образом понимает к…
MS
Sept. 21, 2019, 12:51 p.m.
Mihail Sermjazhko

Так работает import QtQuick 2.7import QtQuick.Window 2.2import QtQuick.Controls 2.0Window { id: demo width: 800 height: 600 visible: true color: "#ff303030" prope…
MS
Sept. 21, 2019, 11:46 a.m.
Mihail Sermjazhko

Говорят через делегат должно работать: ListView{ id:l anchors.fill: parent model: ["data 1","data 2","data 3"] currentIndex : 2 delegate: Text { Rectangle{ …
C
Sept. 21, 2019, 9:08 a.m.
Cobra91151

Здравствуйте! Я хочу подключатся к сетям WiFi Enterprise через свою программу. Настроил Radius Server, поключение к сети через Windows работает. Но при подключении через программу пишет: о…
Sept. 20, 2019, 4:56 a.m.
Pavel K.

Привет , подскажите кто-нибудь , как сделать драг н дроп , не нарушая при этом логику работы зума? import QtQuick 2.6 import QtGraphicalEffects 1.0 Page { id:win property string fi…
EVILEG
About
Services
© EVILEG 2015-2019
Recommend hosting TIMEWEB