По моим исследования работы Qt с SQLite
Во-первых, запрос возвращает ошибку если содержит ";" (т.к. не поддерживает множественность) - хотя и выполняется вроде как
queryApply->prepare( "DELETE FROM users WHERE id=:id;");
Во-вторых, нужно закрывать все запросы сразу после выполнения (сделали INSERT и выполнили, например, query.clear(); далее уже можем сделать DELETE по вставленной записи и снова закрыть запрос query2.clear();
В-третьих, при работе с транзакциями нужно учитывать уровень изоляции READ COMMITED по умолчанию, только зафиксированные изменения можно увидеть, а в рамках транзакции видим только данные на момент ее открытия, хоть и, например, добавили запись
В-четвертых, не исключено возникновение блокировок всей БД на запись - тоже обрабатывайте
В-пятых, наткнулась что вот такой код попробует выполнить вставку 3 раза
QSqlQuery query(strQ);
query.exec(strQ);
query.finish();
Поэтому стараюсь использовать вот такую конструкцию
QSqlQuery query;
query.exec(strQ);
strErr = query.lastError().text(); // если реально нет ошибок в запросе strQ или по результатам запроса, вернет пустую строку
query.clear();