1

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(...);
...
}
4

1 に答える 1