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

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

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

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»/]

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

Qt, SQL, Базы данных, Портфолио

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

Без лишних слов. Вот топ 10 записей 2018 года:

  1. Добавление данных в таблицу QTableWidget. Очистка таблицы
  2. Qt. Динамическое создание виджетов на форме
  3. Подключение к базе данных в Qt
  4. Основы баз данных. ER-модель (сущность-связь)
  5. АС «Складской учет». C++ Builder + MySQL
  6. Получить значения полей выделенной строки QTableView
  7. Отображение данных выборки в виджете QTableView
  8. Значения ячеек выделенных строк QTableView
  9. Контекстное меню в Qt. Popup Menu
  10. Кнопки QMessageBox на русском языке
PostgreSQL, Qt

PostgreSQL: unnest(array)

Моя любимая функция PostgreSQL — unnest (ссылка на документацию)! Она такая простая, но такая классная 😀

Она очень пригодится, если нужно вставить сразу несколько записей за один присест. Допустим, у одной фирмы есть несколько номеров телефонов и, чтобы не перечислять вставку этих данных через запятую, дублируя id фирмы, можно использовать unnest — элегантное решение! Продолжить чтение «PostgreSQL: unnest(array)»

Microsoft SQL Server, PostgreSQL, Qt, Базы данных

Резервное копирование базы данных по расписанию: MS SQL Server и PostgreSQL

Резервное копирование базы данных по расписанию: MS SQL Server и PostgreSQLНе во всех СУБД есть возможность настроить Резервное копирование базы данных по расписанию штатными средствами. Например, в Microsoft SQL Server это делается без проблем, а вот в PostgreSQL такой возможности «из коробки» нет.

Но выход есть: создать файл сценария и добавить его исполнение в расписание задач в Windows.

В переменных database, host, port, userName, bin, backupDir будут храниться значения имени базы данных, сервера, порта, имени пользователя БД, путь к bin папке PostgreSQL и директории сохранения резервных копий соответственно.

Пусть значение driver = 0 будет отвечать за PostgreSQL, а 1 — за Microsoft SQL Server.

Определим текст *.bat-файла:

[pastacode lang=»cpp» manual=»QString%20batText%20%3D%20%22%40ECHO%20OFF%20%5Cn%22%0A%20%20%20%20%20%20%20%20%22SET%20dmpfile%3D%22%2Bdatabase%2B%22-FullBackup-%25DATE%3A~6%2C4%25-%25DATE%3A~3%2C2%25-%25DATE%3A~0%2C2%25%20%5Cn%22%0A%20%20%20%20%20%20%20%20%22IF%20%5C%22%25TIME%3A~0%2C1%25%5C%22%3D%3D%5C%22%20%5C%22%20(SET%20dmpfile%3D%25dmpfile%25-0%25TIME%3A~1%2C1%25)%20ELSE%20(SET%20dmpfile%3D%25dmpfile%25-%25TIME%3A~0%2C2%25)%20%5Cn%22%0A%20%20%20%20%20%20%20%20%22SET%20dmpfile%3D%25dmpfile%25-%25TIME%3A~3%2C2%25-%25TIME%3A~6%2C2%25.backup%20%5Cn%22%0A%20%20%20%20%20%20%20%20%22set%20text%20%3D%20Begin%20to%20backup…%20%5Cn%22%0A%20%20%20%20%20%20%20%20%22echo%20%25text%25%20%5Cn%22%3B%0Aif%20(driver%3D%3D0)%0A%20%20%20%20%20%20%20batText%20%2B%3D%20QString(%0A%20%20%20%20%20%20%20%20%20%20%20%22cd%20%251%5C%20%5Cn%22%0A%20%20%20%20%20%20%20%20%20%20%20%22pg_dump.exe%20—host%20%252%20—port%20%253%20—username%20%254%20—no-password%20—format%22%20%0A%09%09%20%20%20%22custom%20—blobs%20—verbose%20—file%20%5C%22%255%5C%5C%25dmpfile%25%5C%22%20%256%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20.arg(bin%2C%20host%2C%20port%2C%20userName%2C%20%0A%09%09%09%09%20backupDir.replace(%22%2F%22%2C%20%22%5C%5C%22)%2C%20database)%3B%0A%20else%0A%20%20%20%20%20%20%20batText%20%2B%3D%20QString(%22SQLCMD%20-S%20%251%20-E%20-Q%20%5C%22BACKUP%20DATABASE%20%252%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%22TO%20DISK%20%3D%20’%253%2F%25dmpfile%25’%20%22%0A%20%20%20%20%20%20%20%20%20%20%20%22WITH%20INIT%2C%20NOFORMAT%2C%20SKIP%2C%20NOUNLOAD%5C%22%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.arg(host%2C%20database%2C%20backupDir)%3B» message=»» highlight=»» provider=»manual»/]

Имя файла резервной копии будет иметь при этом подобный вид: DatabaseName-FullBackup-2018-08-07 -11-23-38.backup, то есть имя базы данных, FullBackup + таймстемп.

Далее запишем текст в файл: Продолжить чтение «Резервное копирование базы данных по расписанию: MS SQL Server и PostgreSQL»

Microsoft SQL Server, Qt

QSqlQuery::numRowsAffected(), QSqlQuery::size() и MS SQL Server

Для получения количества обработанных записей запросом (insert, update, delete) в Qt используют функцию numRowsAffected(), а для получения размера выборки — size() объекта QSqlQuery:

[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0Aif%20(!query.exec(%22delete%20from%20people%20where%20age%20%3C%2020%22))%20%7B%0A%09qDebug()%20%3C%3C%20%22error%3A%22%20%3C%3C%20query.lastError()-%3Etext()%3B%0A%09return%3B%0A%7D%0AqDebug()%20%3C%3C%20%22rows%20count%22%20%3C%3C%20query.numRowsAffected()%3B» message=»numRowsAffected()» highlight=»6″ provider=»manual»/]

[pastacode lang=»cpp» manual=»QSqlQuery%20query%3B%0Aif%20(!query.exec(%22select%20*%20from%20people%20where%20age%20%3C%2035%22))%20%7B%0A%09qDebug()%20%3C%3C%20%22error%3A%22%20%3C%3C%20query.lastError()-%3Etext()%3B%0A%09return%3B%0A%7D%0AqDebug()%20%3C%3C%20%22rows%20count%22%20%3C%3C%20query.size()%3B» message=»size()» highlight=»6″ provider=»manual»/]

Но не все СУБД поддерживают эту функцию. Например, SQLite и, о Боже! — Microsoft SQL Server (как не стыдно!). Проверить поддержку данной функции (а заодно и функции QSqlQuery::size()) можно так:

[pastacode lang=»cpp» manual=»qDebug()%20%3C%3C%20database.driver()-%3EhasFeature(QSqlDriver%3A%3AQuerySize)%3B» message=»» highlight=»» provider=»manual»/]

где database — объект подключения к базе данных QSqlDatabase. Если в выводе приложения вы увидите false, то прогноз пессимистичен.

Что делать в этом случае?

Продолжить чтение «QSqlQuery::numRowsAffected(), QSqlQuery::size() и MS SQL Server»

Microsoft SQL Server, Qt, Базы данных

Подключение к базе данных MS SQL Server в Qt

В записи Подключение к базе данных в Qt на примере СУБД PostgreSQL я показала, как произвести подключение к базе данных. С MS SQL Server немного запутанней получается (не привыкать).

MS SQL Server может использовать 2 вида аутентификации: аутентификация windows и аутентификация  SQL Server. Ниже рассмотрим оба способа подключения. Продолжить чтение «Подключение к базе данных MS SQL Server в Qt»

C++, Qt, Портфолио

Эмулятор работы инспектора машинного зрения (формирование выходных файлов)

При написании одного проекта мне необходимо обрабатывать файлы, формируемые на основании полученных данных от инспектора машинного зрения. Содержимое файла — список штрих-кодов определенного количества, наименование файла — <год месяц день>_<штрих-код короба>. Эти файлы сохраняются в определенном каталоге,  а формируются с периодичность N миллисекунд. Для тестирования приложения мне необходимо написать эмулятор такого «инспектора». Приложение будет формировать файлы со списком штрих-кодов и сохранять в заданный каталог.

главное окно эмулятора

Основной класс, отвечающий за работу эмулятора выглядит таким образом: Продолжить чтение «Эмулятор работы инспектора машинного зрения (формирование выходных файлов)»

Qt

QTableWidget: добавить список QComboBox  в ячейку

Допустим, в объекте values типа QMap<QString, QString> хранятся некоторые пары значений, которыми необходимо заполнить выпадающие списки QComboBox в таблице типа QTableWidget. Таким образом, для каждой строки будет существовать поле, допустимые значения для которого будут браться из заранее определенного и сформированного списка. Самый простой способ установки некоторого объекта в качестве ячейки таблицы — воспользоваться функцией setCellWidget.

[pastacode lang=»cpp» manual=»ui-%3EtableWidget-%3EsetRowCount(ui-%3EtableWidget-%3ErowCount()%2B1)%3B%0AQComboBox%20*box%20%3D%20new%20QComboBox%3B%0A%2F%2F%D0%B4%D0%BE%D0%B1%D0%B0%D0%B2%D0%B8%D0%BC%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%B9%20%D0%BA%D0%B0%D0%BA%20%D1%8D%D0%BB%D0%B5%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B0%2C%0A%2F%2F%D0%B0%20%D1%81%D0%B0%D0%BC%D0%B8%20%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%20-%20%D0%BA%D0%B0%D0%BA%20userData%0Aforeach(QString%20index%2C%20values.keys())%0A%09box-%3EaddItem(values.value(index)%2C%20index)%3B%0A%2F%2F%D0%BF%D0%BE%20%D0%B3%D0%BE%D1%80%D0%B8%D0%B7%D0%BE%D0%BD%D1%82%D0%B0%D0%BB%D0%B8%20%D1%80%D0%B0%D1%81%D1%82%D1%8F%D0%BD%D0%B5%D0%BC%2C%20%D0%BF%D0%BE%20%D0%B2%D0%B5%D1%80%D1%82%D0%B8%D0%BA%D0%B0%D0%BB%D0%B8%20-%20%D0%BA%D0%B0%D0%BA%20%D1%80%D0%B5%D1%88%D0%B8%D1%82%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B0%20%3A)%0Abox-%3EsetSizePolicy(QSizePolicy%3A%3AExpanding%2C%20QSizePolicy%3A%3APreferred)%3B%0A%2F%2F%D0%B2%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D1%8F%D0%B5%D0%BC%20%D0%B2%20%D1%82%D0%B0%D0%B1%D0%BB%D0%B8%D1%86%D1%83%20QTableWidget%20%D0%B2%20%D0%BA%D0%BE%D0%BB%D0%BE%D0%BD%D0%BA%D1%83%20%E2%84%965%0Aui-%3EtableWidget-%3EsetCellWidget(ui-%3EtableWidget-%3ErowCount()%20-%201%2C%205%2C%20box)%3B» message=»» highlight=»» provider=»manual»/]

Теперь выведем все ключи и их значения списков таблицы в дебаг: Продолжить чтение «QTableWidget: добавить список QComboBox  в ячейку»

C++, Qt, Портфолио

DBRecordWidget — Библиотека-виджет для работы с данными (Qt)

Сегодня вашему вниманию предстанет моя библиотека DBRecordWidget, которую я написала на Qt для удобства разработки пользовательского интерфейса приложения, требующего работу с моделями данных. Это могут быть и SQL модели, и другие. Библиотека не зависит от разновидности.

Открыта для общего доступа на BitBucket:

https://secretsilent@bitbucket.org/slalimited/dbrecordwidget.git

Поподробнее о DBRecordWidget…

Библиотека представляет собой виджет, где можно добавить кнопки Добавить, Изменить, Удалить, Экспорт, Импорт и пр. — в перечислении:

[pastacode lang=»cpp» manual=»namespace%20operationButtons%20%7B%0AQ_NAMESPACE%0Aenum%20buttons%20%7Binsert%3D0%2C%20update%2C%20remove%2C%20import_%2C%20export_%2C%20report%2C%20refresh%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20save%2C%20print%7D%3B%0AQ_ENUM_NS(buttons)%0A%7D» message=»» highlight=»» provider=»manual»/]

Продолжить чтение «DBRecordWidget — Библиотека-виджет для работы с данными (Qt)»