Qt

Динамическое создание виджетов Qt. QGridLayout

В этом сообщении хотелось бы немного отредактировать предыдущий подобный пост Qt. Динамическое создание виджетов на форме.

Задача такая же: Есть объект QGroupBox groupBox, в него надо запихнуть виджеты (labels & lineEdits) в QGridLayout лэйауте. Данные берутся из запроса (он представлен в сообщении по ссылке выше).

Более универсальный способ будет выглядеть так:

[pastacode lang=»cpp» manual=»if(ui-%3EgroupBox-%3Elayout())%20%7B%0A%09QLayoutItem%20*child%3B%0A%20%20%20%20while%20((child%20%3D%20ui-%3EgroupBox-%3Elayout()-%3EtakeAt(0))%20!%3D%200)%20%7B%0A%20%20%20%20%09delete%20child-%3Ewidget()%3B%0A%20%20%20%20%20%20%20%20delete%20child%3B%0A%20%20%20%20%7D%0A%20%20%20%20delete%20ui-%3EgroupBox-%3Elayout()%3B%0A%7D%0AQGridLayout%20*layout%20%3D%20new%20QGridLayout(ui-%3EgroupBox)%3B%0Aui-%3EgroupBox-%3EsetLayout(layout)%3B%0Aint%20pos%20%3D%200%3B%20%2F%2F%D1%83%D1%81%D1%82%D0%B0%D0%BD%D0%B0%D0%B2%D0%BB%D0%B8%D0%B2%D0%B0%D0%B5%D0%BC%20%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8E%20%D1%80%D0%B0%D1%81%D0%BF%D0%BE%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B2%D0%B8%D0%B4%D0%B6%D0%B5%D1%82%D0%BE%D0%B2%20%D0%B2%200%0Aint%20colsCount%20%3D%202%3B%20%2F%2F%D0%9A%D0%BE%D0%BB%D0%B8%D1%87%D0%B5%D1%81%D1%82%D0%B2%D0%BE%20%D0%BA%D0%BE%D0%BB%D0%BE%D0%BD%D0%BE%D0%BA%20%D0%B2%20%D0%BB%D1%8D%D0%B9%D0%B0%D1%83%D1%82%D0%B5%0Awhile%20(query.next())%20%7B%20%2F%2F%D0%B1%D0%B5%D1%80%D0%B5%D0%BC%20%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%D1%8B%20%D0%B7%D0%B0%D0%BF%D1%80%D0%BE%D1%81%D0%B0%0A%09QLabel%20*newLabel%20%3D%20new%20QLabel(this)%3B%0A%20%20%20%20newLabel-%3EsetText(query.value(%22caption%22).toString()%2B%22%3A%22)%3B%0A%20%20%20%20newLabel-%3EsetObjectName(%22label_%22%2Bquery.value(%22name_%22).toString())%3B%0A%20%20%20%20layout-%3EaddWidget(newLabel%2Cpos%2FcolsCount%2Cpos%25colsCount)%3B%0A%20%20%20%20pos%2B%2B%3B%20%2F%2F%D1%81%D0%B4%D0%B2%D0%B8%D0%B3%D0%B0%D0%B5%D0%BC%D1%81%D1%8F%0A%0A%20%20%20%20QLineEdit%20*newEdit%20%3D%20new%20QLineEdit(this)%3B%0A%20%20%20%20newEdit-%3EsetObjectName(query.value(%22name_%22).toString())%3B%0A%20%20%20%20layout-%3EaddWidget(newEdit%2Cpos%2FcolsCount%2Cpos%25colsCount)%3B%0A%20%20%20%20lineEdits.push_back(newEdit)%3B%0A%20%20%20%20pos%2B%2B%3B%0A%7D» message=»» highlight=»» provider=»manual»/]

В данном случае мне необходимо было разместить объекты в бокс с двумя колонками. Поэтому colsCount = 2. Если их должно быть больше, то значение переменной нужно поменять. Очищение лэйаута позволяет при изменении результатов запроса все очистить и нарисовать все в соответствии с актуальными данными.

PostgreSQL, Qt, Портфолио

DBServerWizard — автоматизация работы с базами данных PostgreSQL

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

МенюУстановка сервераРезервное копирование/ восстановление из копииСоздание базы данных
Меню
Установка сервера
Бэкап/рестор
Создание БД

А если расписать немного подробнее, то перечень такой:

  • Установка сервера PostgreSQL (включает предварительную проверку наличия уже установленного сервера).
  • Создание и удаление баз данных. Есть некоторый обязательный набор баз данных; при подключении к серверу происходит проверка наличия этого минимального набора, если какие-либо БД из этого списка отсутствуют, то предлагается произвести создание БД и восстановление из бэкапа. Доступно принудительное удаление при наличии «застрявших» подключений, мешающих операции.
  • Резервное копирование и восстановление из копии. Перед восстановлением базы данных производится резервное копирование «на всякий случай».
  • Обновление баз данных из скриптов. Скрипт разделяется на отдельные инструкции, которые выполняются последовательно. Невыполненные инструкции записываются в отдельный файл.

Следующие сообщения были написаны в течение работы над утилитой:

Qt: Восстановление pg_restore БД PostgreSQL в Windows

Принудительное удаление базы данных в PostgreSQL

Qt: Резервная копия pg_dump БД PostgreSQL в Windows

Файл паролей PostgreSQL pgpass в Windows

Путь к каталогу bin PostgreSQL Windows

Чтобы заказать проект или получить консультацию, перейдите, пожалуйста, на страницу Контакты.

Моё портфолио

Инфо обо мне

Музыка♥, Мысли вслух

Приятное с полезным: Starset & English

Один из блогеров, ролики которого я иногда смотрю, всех приветствует примерно похожей фразой: «Hello, friends! Uuuhhh you look so beautiful today, totally stunning!» 🙂 Почти повторю и поздороваюсь (это почему-то не стало привычкой в моем недоблоге): «Доброго дня вам, мои дорогие друзья!»

Время от времени делаю усиленные попытки не забывать английский язык и смотрю/слушаю иностранные ролики. А совмещать с чем-то реально интересным для меня — польза вдвойне 🙂 Сегодня смотрела/слушала интервью — хоть и пятилетней давности — с вокалистом группы Starset Дастином Бэйтсом. Знакома с этим коллективом больше года наверное, но сподобилась побольше их послушать только сейчас. При прослушивании песни для каждого человека какой-то ее аспект будет играть главенствующую роль: насколько быстр барабанщик, насколько тяжелы гитарные рифы, каков мотивчик в целом, голос вокалиста(ов), смысл текста. Сначала прислушиваюсь к голосу. Если он мне приятен, хочется прочувствовать, о чем же там поется, а если смысла особо и нет, то мне и не интересно. А потом «зацениваю» всю аранжировку в целом. Это касается рок-групп в широком смысле этого слова. Стоит ли объяснять, что в Starset для моего восприятия все гениально сложилось вместе? Невероятно привлекательный вокал + тексты + инструменты (скрипка + электроника + гитары — так можно было? — невообразимо гармоничное сочетание). А переходы от спокойного вокала к агрессиву с хрипотцой? 💗 Была бы я 14-летней девочкой, завесила бы всю свою комнату плакатами Starset и Дастина Бэйтса 😁. Но я же серьезная женщина, поэтому Starset — неизменный спутник моих плейлистов сейчас.

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

И вот еще одно неплохое:

PostgreSQL, Qt

Qt: Восстановление pg_restore БД PostgreSQL в Windows

Здесь: Qt: Резервная копия pg_dump БД PostgreSQL в Windows я показала один из способов организации создания резервной копии базы данных.

Сейчас речь пойдет о восстановлении базы из бэкапа. Здесь тоже будем использовать пакетный файл для вызова pg_restore.

Про каталог bin, файл паролей pgpass написано в статье по ссылке выше.

void myClass::restoreDatabase(QString name, QString file)
{
    QString errorMsg;
    QString connectionName = connectToDB(name, errorMsg);
    if (connectionName.isEmpty()){
        error(errorMsg);
        return;
    }
    QString binDir = postgresBinDirectory();
    if (binDir.isEmpty()) {
        qDebug() << "error";
        QSqlDatabase::removeDatabase(connectionName);
        return;
    }
    QSqlQuery query(QSqlDatabase::database(connectionName));
    if (!query.exec(QString("DROP SCHEMA public cascade;  "
                            "CREATE SCHEMA public "
                            "AUTHORIZATION postgres; "
                            "COMMENT ON SCHEMA public "
                            "IS 'standard public schema'; "
                            "GRANT ALL ON SCHEMA public TO PUBLIC; "
                            "GRANT ALL ON SCHEMA public TO %1;")
                    .arg(postgresUser))) {
        qDebug() << "error";
        QSqlDatabase::removeDatabase(connectionName);
        return;
    }
    QSqlDatabase::removeDatabase(connectionName);
    QString batText = QString("ECHO OFF \n"
                              "SET dmpfile=%1 \n"
                              "set text = Begin to restore...  \n"
                              "echo %text% \n"
                              "cd /d %2 \n"
                              "pg_restore --host=%4 --port=%5 "
                              "--username=%6 --verbose -d "
                              " %3 \"%dmpfile%\"\n"
                              "set /p id=\"The process is finished successfully. "
                              "Press Enter to exit...\"")
            .arg(file, binDir, name,
                 host, ui->port->text(), postgresUser);
    QString fileName = QString("%1-restore.bat")
            .arg(name);
    if (!writeBatFile(batText, fileName, 
					  QCoreApplication::applicationDirPath()+"/temp"))
        return;
//Вызов функции обновления файла паролей
    updatePgPassFile(QString("%1:%2:%3:%4:%5")
                     .arg(host,
                          ui->port->text(),
                          name,
                          postgresUser,
                          ui->password->text()));
    system(qPrintable("cmd.exe /c \""+
                      QDir::toNativeSeparators(
                          QString("%1/%2")
                          .arg(QCoreApplication::applicationDirPath()+"/temp")
                          .arg(fileName)+"\"")));
}
PostgreSQL

Принудительное удаление базы данных в PostgreSQL

Удалить базу данных, не обращая внимание на текущие сессии? Вопрос решается в три запроса!

1. Предотвращаем дальнейшие подключения к базе данных dbase_name:

update pg_database set datallowconn = 'false' 
where datname = 'dbase_name';

2. Закрываем все текущие сессии:

select pg_terminate_backend(pg_stat_activity.pid)
from pg_stat_activity
where pg_stat_activity.datname = 'dbase_name' and 
pid <> pg_backend_pid();

3. Собственно, удаляем базу данных:

drop database dbase_name;

Благодарность отправляется в Хабр Q&A.

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

Qt: Резервная копия pg_dump БД PostgreSQL в Windows

Пример того, как можно реализовать резервное копирование базы данных PostgreSQL в Qt. Создается batch-файл, где вызывается утилита pg_dump.

[pastacode lang=»cpp» manual=»%2F%2FQString%20name%20-%20%D0%B8%D0%BC%D1%8F%20%D0%B1%D0%B0%D0%B7%D1%8B%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B4%D0%BB%D1%8F%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F%20%D0%BA%D0%BE%D0%BF%D0%B8%D0%B8%0A%2F%2Ffile%20-%20%22%D0%BA%D1%83%D0%B4%D0%B0%20%D1%81%D0%BA%D0%BB%D0%B0%D0%B4%D1%8B%D0%B2%D0%B0%D1%82%D1%8C%22%20%D0%B1%D1%8D%D0%BA%D0%B0%D0%BF%0Abool%20myClass%3A%3AbackupDatabase(QString%20name%2C%20QString%20file)%0A%7B%0A%20%20%20%20QString%20binDir%20%3D%20postgresBinDirectory()%3B%0A%20%20%20%20if%20(binDir.isEmpty())%20%7B%0A%20%20%20%20%20%20%20%20error(tr(%22%D0%A1%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%BD%D1%8B%D0%B9%20%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%20bin%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0%20%D0%BD%D0%B5%20%D0%BD%D0%B0%D0%B9%D0%B4%D0%B5%D0%BD.%20%22%0A%09%09%09%09%20%22%D0%9E%D0%BF%D0%B5%D1%80%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B2%D0%BE%D1%81%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%B1%D0%B0%D0%B7%D1%8B%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%22%0A%09%09%09%09%20%22%251%20%D0%B8%D0%B7%20%D1%80%D0%B5%D0%B7%D0%B5%D1%80%D0%B2%D0%BD%D0%BE%D0%B9%20%D0%BA%D0%BE%D0%BF%D0%B8%D0%B8%20%252%20%D0%BF%D1%80%D0%B5%D1%80%D0%B2%D0%B0%D0%BD%D0%B0%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20.arg(name).arg(file))%3B%0A%20%20%20%20%20%20%20%20return%20false%3B%0A%20%20%20%20%7D%0A%20%20%20%20if%20(file.isEmpty())%20%7B%0A%20%20%20%20%20%20%20%20QDir%20dir(QCoreApplication%3A%3AapplicationDirPath()%2B%0A%09%09%09%09%20%22%2Fdb_dumps%2F%22)%3B%0A%20%20%20%20%20%20%20%20if%20(!dir.exists())%0A%20%20%20%20%20%20%20%20%20%20%20%20dir.mkpath(QCoreApplication%3A%3AapplicationDirPath()%2B%0A%09%09%09%09%09%20%20%20%22%2Fdb_dumps%2F%22)%3B%0A%20%20%20%20%20%20%20%20file%20%3D%20QString(%22%251%2F%252-%253.dump%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.arg(QCoreApplication%3A%3AapplicationDirPath()%2B%0A%09%09%09%09%09%20%22%2Fdb_dumps%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.arg(name)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.arg(QDateTime%3A%3AcurrentDateTime()%0A%09%09%09%09%09%20.toString(%22yyyyMMddhhmm%22))%3B%0A%20%20%20%20%7D%0A%20%20%20%20QString%20text%20%3D%20QString(%0A%09%09%22%40ECHO%20OFF%20%5Cn%22%0A%20%20%20%20%20%20%20%20%22cd%20%2Fd%20%251%20%5Cn%22%0A%20%20%20%20%20%20%20%20%22pg_dump%20-Fc%20-U%20%254%20-Z%209%20-v%20%252%20%3E%20%5C%22%253%5C%22%20%5Cn%22%0A%20%20%20%20%20%20%20%20%22set%20%2Fp%20id%3D%5C%22Press%20Enter%20to%20exit…%5C%22%5Cn%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20.arg(binDir)%0A%20%20%20%20%20%20%20%20%20%20%20%20.arg(name)%0A%20%20%20%20%20%20%20%20%20%20%20%20.arg(file)%0A%20%20%20%20%20%20%20%20%20%20%20%20.arg(postgresUser)%3B%0A%20%20%20%20QString%20fileName%20%3D%20QString(%22%251-dump.bat%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20.arg(name)%3B%0A%09%2F%2F%D0%B7%D0%B0%D0%BF%D0%B8%D1%81%D1%8C%20%D0%97%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D1%8F%20%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8%20text%20%D0%B2%20%D1%84%D0%B0%D0%B9%D0%BB%20*.bat%0A%20%20%20%20if%20(!writeBatFile(text%2C%20fileName%2C%20%0A%09%09%09%09%20QCoreApplication%3A%3AapplicationDirPath()%2B%22%2Ftemp%22))%0A%09%09return%3B%0A%09%2F%2F%D0%BE%D0%B1%D0%BD%D0%BE%D0%B2%D0%BB%D0%B5%D0%BD%D0%B8%D0%B5%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%20%D0%BF%D0%B0%D1%80%D0%BE%D0%BB%D0%B5%D0%B9%20pgpass%0A%20%20%20%20updatePgPassFile(QString(%22%251%3A%252%3A%253%3A%254%3A%255%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.arg(host%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui-%3Eport-%3Etext()%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20name%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20postgresUser%2C%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20ui-%3Epassword-%3Etext()))%3B%0A%09%2F%2F%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE%20batch%20%D1%84%D0%B0%D0%B9%D0%BB%D0%B0%0A%20%20%20%20system(qPrintable(%22cmd.exe%20%2Fc%20%5C%22%22%2B%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20QDir%3A%3AtoNativeSeparators(%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20QString(%22%251%2F%252%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.arg(QCoreApplication%3A%3AapplicationDirPath()%2B%0A%09%09%09%09%09%09%09%20%20%20%22%2Ftemp%22)%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20.arg(fileName)%2B%22%5C%22%22)))%3B%0A%09%2F%2F%D0%B5%D1%81%D0%BB%D0%B8%20%D1%84%D0%B0%D0%B9%D0%BB%20%D0%B1%D1%8D%D0%BA%D0%B0%D0%BF%D0%B0%20%D0%B8%D0%BC%D0%B5%D0%B5%D1%82%20%D0%BD%D0%B5%D0%BD%D1%83%D0%BB%D0%B5%D0%B2%D0%BE%D0%B9%20%D1%80%D0%B0%D0%B7%D0%BC%D0%B5%D1%80%0A%20%20%20%20return%20QFileInfo(file).size()%20%3E%200%3B%0A%7D» message=»» highlight=»» provider=»manual»/]

Как узнать путь к каталогу bin сервера PostgreSQL, подробно написано здесь: Путь к каталогу bin PostgreSQL Windows. При условии известности имени пользователя и его пароля можно запустить утилиту pg_dump без необходимости авторизации пользователем при наличии соответствующей строки подключения в файле паролей pgpass, про что подробно писала в этой статье: Файл паролей PostgreSQL pgpass в Windows. В вышеприведенном коде используется функция updatePgPassFile(QString), код которой можно найти по обозначенной ссылке.

Более ранняя статья на схожую тему: Резервное копирование базы данных по расписанию: MS SQL Server и PostgreSQL

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

Файл паролей PostgreSQL pgpass в Windows

Для восстановления базы данных из резервной копии используется исполняемый файл сервера pg_restore. Если в настройках сервера выставлена авторизация по имени и паролю, то при использовании утилиты необходимо вводить пароль при каждой операции восстановления БД из бэкапа. Что не подходит в случае пакетной операции, например, или когда операция должна производится без взаимодействия с пользователем в этом ключе. Тогда сервер использует файл паролей pgpass. Он может и отсутствовать. Что тогда делать? Создать и обновлять. Продолжить чтение «Файл паролей PostgreSQL pgpass в Windows»

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

Путь к каталогу bin PostgreSQL Windows

Задача: получить значение пути к каталогу бинарников сервера — к каталогу bin. Путь к каталогу data, как и прочие значения параметров времени выполнения, найти совершенно несложно: достаточно выполнить запрос show, воспользоваться функцией current_setting() или обратиться к представлению pg_settings:

[pastacode lang=»sql» manual=»show%20data_directory%3B%0Aselect%20current_setting(‘data_directory’)%3B%0Aselect%20setting%20from%20pg_settings%20%0A%20%20%20where%20name%20%3D%20’data_directory’%3B» message=»Три равнозначных примера получения значения пути к каталогу data» highlight=»» provider=»manual»/]

Еще парочку примеров показывала вот в этой записи: Количество подключений к БД PostgreSQL.

С значением пути к каталогу bin не все так просто — запросом его не получишь. Но можно узнать из реестра. В реестре не хранится чистый ключ со значением пути к каталогу, к сожалению, но можно узнать путь к исполняемому файлу службы сервера.

Итак, интересующий нас ключ: Продолжить чтение «Путь к каталогу bin PostgreSQL Windows»