为了避免阻塞GUI线程,我希望在分离的线程上执行SQL。由于必须在运行QSqlQuery::exec方法的线程中创建QSqlQuery,所以我已经创建了一个槽,该槽返回一个QSqlQuery对象,并将其与Qt::BlockingQueuedConnection信号连接。然而,它报告说
连接:不能将类型为'QSqlQuery&‘的参数排队(确保使用qRegisterMetaType()注册了'QSqlQuery&’)。
在跑步的时候。
但是,注册"QSqlQuery&“将导致
错误C2770:“int qRegisterMetaType(T *)”的无效显式模板参数
在VisualVISUALVISUAL8.0中注册“C++”很好。请帮助我创建一个用于准备的和另一个线程上的bindValue。
非常感谢!
这是我的代码片段。
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(...);
...
}发布于 2013-08-20 08:20:58
我已经找到答案了。
QSqlQuery::准备和QSqlQuery::bindValue方法不能在创建它们的线程之外调用。因此,没有理由在信号插槽中传递它。
https://stackoverflow.com/questions/18309617
复制相似问题