2013-08-19 100 views
0

我想在一個單獨的線程上執行SQL以避免阻塞GUI線程。由於QSqlQuery必須在運行QSqlQuery :: exec方法的線程中創建,因此我創建了一個返回QSqlQuery對象並將其與Qt :: BlockingQueuedConnection信號連接的插槽。然而,報告多線程QSqlQuery

的QObject ::連接:運行不能排隊類型 'QSqlQuery &' 的論點

(確保 'QSqlQuery &' 使用qRegisterMetaType()註冊)。

但是,登記在

錯誤C2770 「QSqlQuery &」 結果: 'INT qRegisterMetaType(T *)'

在Visual C++ 8.0

而註冊無效顯式模板參數(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(...); 
... 
} 

回答

1

我已經找到答案了。

QSqlQuery :: prepare和QSqlQuery :: bindValue方法不能在創建它們的線程之外調用。因此沒有理由在信號時隙中傳遞它。