Qt и SQLite

При использовании библиотеки Qt и встроенной в нее СУБД SQLite возникает желание проверять запросы вне исходного кода программы. Желательно проверять запросы с той же версией, что встроена в Qt.

Возьмем исходный код Qt. На данный момент я использую версию 5.4.0 и установил исходный код при установке Qt. Все действия происходят в терминале Линукса.

Перейдем в каталог с исходным кодом SQLite:

cd /opt/Qt5.4.0/5.4/Src/qtbase/src/3rdparty/sqlite

Соберем клиент SQLite и поместим его в /opt:

sudo gcc shell.c sqlite3.c -lpthread -ldl -o  /opt/sqlite3

Проверим версию:

/opt/sqlite3 --version

Готово.

Реклама

Развертывание Qt-приложений в Windows

Для распространения программы, написанной на Qt под Windows, кроме исполняемого файла необходимо вместе с ним предоставлять множество DLL. Раньше (до Qt 5.2) приходилось вручную искать DLL в папке Qt и размещать их рядом с исполняемым файлом. Теперь, для автоматизации этого процесса, есть программа windeployqt, которая поставляется вместе с Qt.

windeployqt — консольная программа, поэтому для ее запуска нужно воспользоваться командной строкой.

Командную строку не стоит запускать так, как это обычно делается в Windows. Qt предоставляет свой способ запуска командной строки, который позволяет вызывать консольные программы Qt без лишних телодвижений. В программах меню «Пуск» должен быть соответствующий пункт в разделе Qt. Например, для Qt 5.7.0 (MinGW 5.3.0) этот пункт называется

Qt 5.7 for Desktop (MinGW 5.3.0 32 bit)

и имеет характерную иконку командной строки.

Запуск windeployqt выглядит следующим образом:

windeployqt <путь>

где <путь> — это путь к исполняемому файлу вашей программы или папке, в которой этот файл находится.

Пример:

windeployqt C:\example\build\release\example.exe

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

Рекомендации

Разделение файлов сборки и рабочих файлов

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

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

DESTDIR = папка_программы

где папка_программы — это имя папки, где будет размещен исполняемый файл, отдельно от файлов сборки. После выполнения windeployqt в этой папке будут находиться только файлы необходимые для работы программы. Что облегчит их распространение или создание установщика.

Примечание: имя папки не должно содержать кириллицу.

Автоматическое развертывание

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

win32:QMAKE_POST_LINK += windeployqt $$OUT_PWD/$$DESTDIR

где $$OUT_PWD/$$DESTDIR задает папку с исполняемым файлом. Задание папки не универсально и работает если в DESTDIR указан относительный путь.

Ссылки

Описание windeployqt на официальном сайте.

Определение версии SQLite в Qt

Исходный код SQLite находится в каталоге

<Каталог Qt>/Src/qtbase/src/3rdparty/sqlite

версию можно найти в файле sqlite3.c или sqlite3.h.

Заглянув в репозиторий Qt можно узнать версию SQLite для различных версий Qt, например Qt 5.3.0 включает SQLite 3.8.4.3.

История версий SQLite.

Проблема закрытия консольной Qt-программы

У многих возникает такая проблема.

У объекта QCoreApplication есть функции quit() и exit(), но не имеет смысла их вызывать до вызова exec().

Следующий код закроет программу сразу после вызова функции exec(). На помощь приходит QTimer.

#include <QtCore/QCoreApplication>
#include <QTimer>

int main(int argc, char *argv[])
{
  QCoreApplication a(argc, argv);
  // ...
  QTimer::singleShot(0, &a, SLOT(quit()));
  // ...
  return a.exec();
}