Пара мнений:
Эта петля while
в exec
исключает преимущества наличия отдельной нити. Вы должны передать запрос в конструкторе, иметь один поток на запрос, не переопределять exec
, предпочитать просто использовать start и использовать сигналы для асинхронного сообщения о любой ошибке.
Вам также следует передать QSqlQuery по значению или сохранить его в управляемом указателе, таком как std::auto_ptr
(или std::unique_ptr
для C ++ 11). Многие классы Qt неявно совместно используются (хотя и не этот), но управляемые указатели обеспечивают вам исключительную безопасность.
Лично я бы просто сделал что-то подобное
class Query : public QThread {
QSqlQuery m_query;
// I prefer values unless there's a particular reason to use pointers.
public:
Query (const QSqlQuery & query)
: m_query (query)
{
}
void run ()
{
emit finished (m_query .exec ());
deleteLater ();
}
public signals:
void finished (bool);
};
Query * q = new Query ("SELECT foo FROM bar");
connect (q, SIGNAL (finished (bool), ...);
q -> start ();