"Нет" выгоранию, C++, PostgreSQL, Qt, Мысли вслух

Незамеченные записи 2019 года

Начнем еще одну традицию — заведем тему о скромных темах. Стоят там в сторонке, никто на них не смотрит 🙂

  1. «Нет» выгоранию: прогулки на свежем воздухе
  2. Волшебство в обычном месте
  3. Мини-путешествие к Браславским озёрам
  4. Jobs trace: Учет потраченного на проекты времени
  5. Няня вместо мамы для больничных детей
  6. Qt: Добавить свой виджет на форму
  7. DBRecordWidget — Библиотека-виджет для работы с данными (Qt)
  8. Вывод даты с указанием часового и минутного смещения timezone в PostgreSQL
  9. Количество подключений к БД PostgreSQL
  10. Изменить цвет фона и текста ячейки или строки QTableView
Microsoft SQL Server, PostgreSQL, Qt, SQL, Базы данных

Лучшие записи 2019 года

Продолжим традицию: ниже темы, имеющие наилучшую статистику посещений за 2019 год. Пост за прошлый год: Лучшие записи за 2018 год

  1. Основы баз данных. ER-модель (сущность-связь)
  2. Добавление данных в таблицу QTableWidget. Очистка таблицы
  3. Функция, возвращающая таблицу returns table — в PostgreSQL и MS SQL Server
  4. PostgreSQL: unnest(array)
  5. PostgreSQL: Размер таблиц и базы данных
  6. PostgreSQL: Узнать данные о колонках таблицы
  7. Получить значения полей выделенной строки QTableView
  8. Qt. Динамическое создание виджетов на форме
  9. Триггеры в PostgreSQL
  10. Подключение к базе данных в Qt
C++, Qt, Портфолио

Jobs trace: Учет потраченного на проекты времени

В сообщении Qt: Добавить свой виджет на форму уже немного рассказала по поводу вышеуказанной темы. А тема — небольшая программка Jobs trace 🙂

Я вписывала в Гугл таблицы проведенное время над тем или иным проектом или отдельным заданием и , исходя из этих данных, высчитывала стоимость работы. Но для меня такой вариант не очень удобен — каждый раз регистрировать время начала и конца, потом это все подводить к итогу и т.д. Мне показалось это муторным, я решила поискать какой-то онлайн подсчитыватель отработанного времени. Но все это было не то. Было решено — напишу так, как надо мне, чтобы было просто и удобно:

  • Признак начала и конца работы над проектом — один клик по кнопке
  • Автоматический расчет стоимости работы по введенной почасовой ставке
  • Сохранение данных текущих заданий
  • Возможность ведения нескольких заданий
  • Каждое задание на своей вкладке
  • Присваивать заданию пользовательское название
  • После переоткрытия приложения разворачивать данные уже имеющихся заданий
  • Удаление заданий кликом по кнопке

[metaslider id=819]

Данные задания записываются в текстовый файл с содержимым вида:

<Название задания>

<Количество потраченных на проект секунд>

<Почасовая ставка>

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

Сам проект Jobs trace можно посмотреть/скачать/склонировать на bitbucket.org: https://bitbucket.org/secretsilent/jobstrace/

Qt

Qt: Добавить свой виджет на форму

Допустим, у нас есть определенный набор виджетов, который нужно повторить на каждой странице объекта QTabWidget. Этих страниц может быть очень много. Один из самых удобных и простых способов создавать такие страницы с нужным набором элементов — это создать виджет с этим набором и помещать его на каждую новую страницу.

Для создания виджета сделаем следующее: Файл->Создать файл или проект…->Qt (Класс формы Qt Designer), в разделе templates/forms выбираем Widget. Нам необходимо, чтобы наша форма была потомком QWidget.

На новой форме располагаем все необходимые элементы. Например, вот так: Продолжить чтение «Qt: Добавить свой виджет на форму»

Qt, Базы данных

Добавление данных запроса в таблицу QTableWidget

Здесь: Добавление данных в таблицу QTableWidget. Очистка таблицы — я рассказала, как заполнить таблицу QTableWidget данными из объекта QMap. Можно сказать, через годы и расстояния :), я решила чуть больше развернуть эту тему и показать, как организовать добавление данных запроса в таблицу. Для тех, кому по какой-то причине нужно использовать объект QTableWidget вместо QTableView. Продолжить чтение «Добавление данных запроса в таблицу QTableWidget»

Мысли вслух

Няня вместо мамы для больничных детей

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

PostgreSQL

Количество подключений к БД PostgreSQL

Чтобы узнать количество подключений к той или иной базе, воспользуйтесь запросом

select count(datid) from pg_stat_activity
where datname = 'table_name'

Представление pg_stat_activity очень интересное: можно узнать последний выполненный запрос клиента, его IP, состояние и много чего другого, о чем можно прочитать в документации.

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

show max_connections

А чтобы изменить это значение, придется прогуляться в файл конфигурации. Чтобы точно узнать его путь «лежки», можно выполнить нехитрый запрос:

show config_file

А какие именно манипуляции с файлом производить, неплохо написано вот тут.

О том, как узнать размер таблиц и баз данных, можно ознакомиться в сообщении PostgreSQL: Размер таблиц и базы данных

Qt

Изменить цвет фона и текста ячейки или строки QTableView

Для решения поставленной задачи отнаследуемся от класса QIdentityProxyModel:

[pastacode lang=»cpp» manual=»%23include%20%3CQDialog%3E%0A%23include%20%3CQSqlQueryModel%3E%0A%23include%20%3CQIdentityProxyModel%3E%0A%0Aclass%20ColorCell%20%3A%20public%20QIdentityProxyModel%0A%7B%0Apublic%3A%0A%20%20%20%20ColorCell()%20%7B%7D%0Aprotected%3A%0A%20%20%20%20virtual%20QVariant%20data(const%20QModelIndex%20%26index%2C%20int%20role)%20const%3B%0A%7D%3B%0A%0A%0Aclass%20myClass%3A%20public%20QDialog%20%7B%0A….%0Aprivate%20slots%3A%0A%09void%20updateModel()%3B%0Aprivate%3A%0A%09QSqlQueryModel%20*model%3B%0A%09ColorCell%20*colorCellModel%3B%0A%7D» message=»» highlight=»» provider=»manual»/]

Переопределим функцию data:

[pastacode lang=»cpp» manual=»QVariant%20ColorCell%3A%3Adata(const%20QModelIndex%20%26index%2C%20int%20role)%20const%0A%7B%0A%20%20%20%20%2F%2F%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%86%D0%B2%D0%B5%D1%82%D0%B0%20%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0%20%D0%BD%D0%B0%20%D0%BA%D1%80%D0%B0%D1%81%D0%BD%D1%8B%D0%B9%20%D0%B2%200-%D0%BE%D0%B9%20%D0%BA%D0%BE%D0%BB%D0%BE%D0%BD%D0%BA%D0%B5%0A%09if%20(role%20%3D%3D%20Qt%3A%3AForegroundRole)%20%7B%0A%20%20%20%20%20%20%20%20if%20(index.column()%20%3D%3D%200)%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20QBrush(Qt%3A%3Ared)%3B%0A%20%20%20%20%7D%0A%09%2F%2F%D0%B8%D0%B7%D0%BC%D0%B5%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%86%D0%B2%D0%B5%D1%82%D0%B0%20%D1%84%D0%BE%D0%BD%D0%B0%20%D0%B2%D1%81%D0%B5%D0%B9%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20%D0%BF%D0%BE%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%B2%20%D1%8F%D1%87%D0%B5%D0%B9%D0%BA%D0%B5%204-%D0%BE%D0%B9%20%D0%BA%D0%BE%D0%BB%D0%BE%D0%BD%D0%BA%D0%B8%0A%09if%20(role%20%3D%3D%20Qt%3A%3ABackgroundRole)%20%7B%0A%20%20%20%20%20%20%20%20if(!index.model()-%3Edata(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20index.model()-%3Eindex(index.row()%2C%204)%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20Qt%3A%3ADisplayRole).toBool())%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20QBrush(Qt%3A%3Agreen)%3B%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20return%20QBrush(Qt%3A%3Ablue)%3B%0A%20%20%20%20%7D%0A%20%20%20%20return%20QIdentityProxyModel%3A%3Adata(index%2C%20role)%3B%0A%7D» message=»» highlight=»» provider=»manual»/]

Теперь определим для нашей прокси-модели ее модель-источник:

[pastacode lang=»cpp» manual=»myClass%3A%3AmyClass(QWidget%20*parent)%20%3A%0A%20%20%20%20QDialog(parent)%2C%0A%20%20%20%20ui(new%20Ui%3A%3ABuffer)%0A%7B%0A%09ui-%3EsetupUi(this)%3B%0A%20%20%20%20colorCellModel%20%3D%20nullptr%3B%0A%09model%20%3D%20nullptr%3B%0A%09updateModel()%3B%0A%7D%0A%0Avoid%20myClass%3A%3AupdateModel()%20%7B%0A%09if%20(!model)%20%7B%0A%09%09model%20%3D%20new%20QSqlQueryModel%3B%0A%20%20%20%20%09colorCellModel%20%3D%20new%20ColorCell%3B%0A%20%20%20%20%09ui-%3EtableView-%3EsetModel(colorCellModel)%3B%0A%09%7D%0A%09model-%3EsetQuery(%3Cquery%20text%3E)%3B%0A%09colorCellModel-%3EsetSourceModel(model)%3B%0A%7D» message=»Установка модели в качестве sourceModel для обработки прокси-моделью» highlight=»» provider=»manual»/]

Теперь таблица будет раскрашена в соответствии с заданными условиями.

О том о сём

Мини-путешествие к Браславским озёрам

Будучи вольно наемным работником, удобно путешествовать — далеко или не совсем, —  не прерывая работы. Этим летом мы решили посетить наши белорусские озера — Браславские. От нас они находятся на другом конце страны, хотя страна у нас небольшая. Наш автомобиль нас слегка подвел, отказавшись подвести до пункта назначения, поэтому было принято решение добираться на общественном транспорте. Из Кобрина до Минска мы ехали на поезде ночью. Дети любят кататься на поездах, а особенно спать в них 🙂 В Минске утром сели в маршрутный микроавтобус и через примерно 4 часа были в Браславе. Продолжить чтение «Мини-путешествие к Браславским озёрам»