我想在单独的线程上执行 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(...);
...
}