Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Qt4 多线程QSqlQuery_Qt4_Qthread_Qsqlquery - Fatal编程技术网

Qt4 多线程QSqlQuery

Qt4 多线程QSqlQuery,qt4,qthread,qsqlquery,Qt4,Qthread,Qsqlquery,我希望在一个单独的线程上执行SQL,以避免阻塞GUI线程。由于必须在运行QSqlQuery::exec方法的线程中创建QSqlQuery,因此我创建了一个插槽,该插槽返回一个QSqlQuery对象,并使用Qt::BlockingQueuedConnection信号将其连接起来。然而,据报道 QObject::connect:无法对类型为“QSqlQuery&”的参数进行排队 (确保使用qRegisterMetaType()注册了'QSqlQuery&' 跑步的时候 但是,注册“QSqlQuery

我希望在一个单独的线程上执行SQL,以避免阻塞GUI线程。由于必须在运行QSqlQuery::exec方法的线程中创建QSqlQuery,因此我创建了一个插槽,该插槽返回一个QSqlQuery对象,并使用Qt::BlockingQueuedConnection信号将其连接起来。然而,据报道

QObject::connect:无法对类型为“QSqlQuery&”的参数进行排队 (确保使用qRegisterMetaType()注册了'QSqlQuery&'

跑步的时候

但是,注册“QSqlQuery&”会导致

错误C2770:“int qRegisterMetaType(T*)”的显式模板参数无效

在Visual C++ 8中注册“QSQL查询”工作精细。请帮助我在另一个线程上为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(...);
...
}

我已经找到了答案

QSqlQuery::prepare和QSqlQuery::bindValue方法不能在创建它们的线程之外调用。因此,没有理由在信号槽中传递它