GUI スレッドのブロックを回避するために、別のスレッドで SQL を実行したいと考えています。QSqlQuery::exec メソッドを実行するスレッドで QSqlQuery を作成する必要があるため、QSqlQuery オブジェクトを返すスロットを作成し、それを Qt::BlockingQueuedConnection シグナルに接続します。しかし、それは報告します
QObject::connect: タイプ 'QSqlQuery&' の引数をキューに入れることができません (qRegisterMetaType() を使用して 'QSqlQuery&' が登録されていることを確認してください)。
走っている間。
ただし、「QSqlQuery&」を登録すると、
エラー C2770: 'int qRegisterMetaType(T *)' の明示的なテンプレート引数が無効です
「QSqlQuery」の登録中のVisual C++ 8.0では正常に動作します。別のスレッドで準備および bindValue 用の 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(...);
...
}