首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多线程QSqlQuery

多线程QSqlQuery
EN

Stack Overflow用户
提问于 2013-08-19 08:40:33
回答 1查看 748关注 0票数 1

为了避免阻塞GUI线程,我希望在分离的线程上执行SQL。由于必须在运行QSqlQuery::exec方法的线程中创建QSqlQuery,所以我已经创建了一个槽,该槽返回一个QSqlQuery对象,并将其与Qt::BlockingQueuedConnection信号连接。然而,它报告说

连接:不能将类型为'QSqlQuery&‘的参数排队(确保使用qRegisterMetaType()注册了'QSqlQuery&’)。

在跑步的时候。

但是,注册"QSqlQuery&“将导致

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

在VisualVISUALVISUAL8.0中注册“C++”很好。请帮助我创建一个用于准备的和另一个线程上的bindValue。

非常感谢!

这是我的代码片段。

代码语言:javascript
复制
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(...);
...
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-20 08:20:58

我已经找到答案了。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18309617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档