Qt4 多线程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。 非常感谢 这是我的密码剪Qt4 多线程QSqlQuery,qt4,qthread,qsqlquery,Qt4,Qthread,Qsqlquery,我希望在一个单独的线程上执行SQL,以避免阻塞GUI线程。由于必须在运行QSqlQuery::exec方法的线程中创建QSqlQuery,因此我创建了一个插槽,该插槽返回一个QSqlQuery对象,并使用Qt::BlockingQueuedConnection信号将其连接起来。然而,据报道 QObject::connect:无法对类型为“QSqlQuery&”的参数进行排队 (确保使用qRegisterMetaType()注册了'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(...);
...
}
我已经找到了答案 QSqlQuery::prepare和QSqlQuery::bindValue方法不能在创建它们的线程之外调用。因此,没有理由在信号槽中传递它