2

別のクラス テンプレートを使用して、 QListofQObjectsを別のクラスにキャストする方法が見つかりません。QListのインスタンスを作成しQObjectsてから返す関数がありますQList。私の質問は、それQListを別QListのテンプレート クラス ポインターにキャストできますか?

私のコード:

QList<QObject *> DbManager::listVO(QString voname)
{
    DbManager::VOPropertiesJoin(DbManager::VOKeys(obj),VOJOIN_BOTH,"=");
    QList<QObject *> vos;

    QString voquery = "select * from %1";
    voquery = voquery.arg(voname);
    QSqlQueryModel *volist = DbManager::makeSelect(voquery);

    for(int i = 0;i < volist->rowCount();i++){
        QSqlRecord record =volist->record(i);
        QObject *voinstance = DbManager::instantiateVO(voname,record.value(0),record.value(1),record.value(2),record.value(3),record.value(4),record.value(5),record.value(6),record.value(7));
        vos << voinstance;
    }
    return vos;
}

そして、私はこのようなものが欲しい:

QList<AnyClass*> list = DbManager::listVO("AnyClass");

事前に助けてくれてありがとう。

4

1 に答える 1

5

最後に必要なのは であるため、次のようなことを試すことができます(から派生したQList<AnyClass*>と仮定します)AnyClassQObject

注:巨大なリストを返すことは効率的ではない可能性があるため、参照によってリストを渡すように元のコードにいくつかの変更を加えました。私はコードをコンパイルしませんでしたが、このスニペット内で何が起こっているかを理解できることを願っています

void DbManager::listVO(QString voname, QList<AnyClass*>& listAnyClass)
{
    DbManager::VOPropertiesJoin(DbManager::VOKeys(obj),VOJOIN_BOTH,"=");

    // Initialise list with an empty list
    listAnyClass = QList<AnyClass*>();

    QString voquery = "select * from %1";
    voquery = voquery.arg(voname);
    QSqlQueryModel *volist = DbManager::makeSelect(voquery);

    for(int i = 0; i < volist->rowCount(); i++)
    {
        QObject *voinstance = GetInstance(voname, volist->record(i));

        // Trying to cast into an AnyClass
        AnyClass* pAnyClass = qobject_cast<AnyClass*>(voinstance);

        // If pAnyClass is a valid AnyClass* update your list
        if(pAnyClass)
        {
            listAnyClass.append(pAnyClass);
        }
    }
}

QObject* DbManager::GetInstance(QString sVoname, const QSqlRecord& record)
{
    return DbManager::instantiateVO
    (
        voname,
        record.value(0),
        record.value(1),
        record.value(2),
        record.value(3),
        record.value(4),
        record.value(5),
        record.value(6),
        record.value(7)
    )
}

DbManager::listVO(QString voname, QList<AnyClass*>& listAnyClass)関数を呼び出した後、listAnyClassそれに応じてデータが入力されます。リストを返すのとは対照的に、これは効率的です。

編集:

つまり、一言で言えば、 a を に変換QList<QObject*>QList<AnyClass*>ます。したがって、元のコードをそのままにして、この変換を行いたい場所に次のようなメソッドを実装します。

void ConvertToAnyClassList(const QList<QObject*>& listQObjects, QList<AnyClass*>& listAnyClass)
{
    listAnyClass = QList<AnyClass*>();
    for( int i = 0; i < listQObjects.length(); ++i )
    {
        AnyClass* pAnyClass = qobject_cast<AnyClass*>(listQObjects.at(i));

        if(pAnyClass)
        {
            listAnyClass.append(pAnyClass)
        }
    }
}

そして、次のように呼び出すことができます:

QList<QObject*> listQObjects = DbManager::listVO("AnyClass");
QList<AnyClass*> listAnyClass;
ConvertToAnyClassList(listQObjects,listAnyClass);

複数のタイプがあると仮定すると、次のようにタイプごとに関数を実装することができます。

ConvertToUserList(listQObjects,listUserObjects);
ConvertToCountryList(listQObjects,listCountryObjects);
于 2013-04-06T05:00:11.737 に答える