1

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

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

在跑步的时候。

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

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

在 Visual C++ 8.0 中注册“QSqlQuery”工作正常。请帮我在另一个线程上为准备和绑定值创建一个 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(...);
...
}
4

1 回答 1

2

我已经找到了答案。

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

于 2013-08-20T08:20:58.503 回答