0
我想在一個單獨的線程上執行SQL以避免阻塞GUI線程。由於QSqlQuery必須在運行QSqlQuery :: exec方法的線程中創建,因此我創建了一個返回QSqlQuery對象並將其與Qt :: BlockingQueuedConnection信號連接的插槽。然而,報告多線程QSqlQuery
的QObject ::連接:運行不能排隊類型 'QSqlQuery &' 的論點
(確保 'QSqlQuery &' 使用qRegisterMetaType()註冊)。
但是,登記在
在Visual C++ 8.0錯誤C2770 「QSqlQuery &」 結果: 'INT qRegisterMetaType(T *)'
而註冊無效顯式模板參數(S) 「QSqlQuery」工作正常。請幫我在另一個線程上爲prepare和bindValue創建一個QSqlQuery。
很多謝謝!
這是我的代碼片段。
class Handler
: public QObject
{
Q_OBJECT
...
public slots:
void onGetQuery
(QSqlQuery& orQuery
)
{
orQuery = QSqlQuery(mrDb);
}
void onExec
(QSqlQuery irQuery
)
{
irQuery.exec();
fireReady(irQuery);
}
protected:
QSqlDatabase mrDb;
...
signals:
void fireReady
(QSqlQuery irQuery
);
};
class Db
: public QObject
{
Q_OBJECT
...
public:
Db
(Handler* ipHandler
)
: QObject(0)
{
connect(
this,
SIGNAL(fireGetQuery(QSqlQuery&)),
ipHandler,
SLOT(onGetQuery(QSqlQuery&)),
Qt::BlockingQueuedConnection);
}
void getQuery
(QSqlQuery& orQuery
)
{
fireGetQuery(orQuery);
}
...
signals:
void fireGetQuery
(QSqlQuery& orQuery
);
};
int main
(int inArgc
, char* ipArgv[]
)
{
QCoreApplication lrApp(inArgc, ipArgv);
...
Db lrDb(lpHandler);
QSqlQuery lrQuery;
lrDb.getQuery(lrQuery);
lrQuery.prepare(...);
lrQuery.bindValue(...);
...
}