2

私は最近Qtを再び手に入れ、記憶をリフレッシュし始めました。テーブルのカスタムデータモデルの作成は簡単でした。

現在、選択したデータを取得しようとしています。カスタムデータオブジェクトを使用していることに注意してください。

私のカスタムモデルの例:

platform.h

class Platform
{
public:
    Platform();
    Platform(QString name);
    QString getName();
    void setName(QString name);
private:
    QString m_name;
};

テスト目的の非常に単純なデータ構造。次に、QAbstractTableModelを実装しました。Data()メソッドは次のようになります。

platformmodel.cpp

QVariant PlatformModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    if (index.row() >= m_platforms.size() || index.row() < 0)
        return QVariant();

    if (role == Qt::DisplayRole) {
        Platform platform = m_platforms.at(index.row());
        qDebug() << platform.getName();
        return platform.getName();
    }
    return QVariant();
}

このコードから私が理解しているのは、選択可能なアイテムの場合、プラットフォームオブジェクトではなく、常に文字列が返されるということです。

表示する場合、これは正常に機能します。ビューに実際のオブジェクトが表示されます。ここで、QStringだけでなく、モデルから実際のオブジェクトを選択したいと思います。

したがって、メソッド本体は次のようになります。

void MainWindow::selectionChangedSlot(const QItemSelection &, const QItemSelection &)
{
    //get the text of the selected item
    const QModelIndex index = ui->lvPlatforms->selectionModel()->currentIndex();
    Platform selectedPlatform = index.data();//This returns a QVariant and will fail at compile time, but I want to achieve something along this line.
    setWindowTitle(selectedPlatform.getName());
}

追伸私は間違ったものを検索しようとしているのかもしれません。カスタムオブジェクトを使用する例を見つけることができますが、選択したアイテムの取得については何も話していません。

文字列を取得し、プラットフォームのリストをループして名前を選択したアイテムと比較するより良い方法が必要です。大きなリストがある場合、各アイテムをループして文字列の比較を行う必要はあまり効率的ではありません。 。

私の問題が十分に明確であることを願っています。重要なことが不足している場合は、例を編集できるようにお知らせください。

編集

Q_DECLARE_METATYPE(Platform);を試しました。

そして、はい、それは機能します、それはそれをQVariantに保存することを可能にします、問題は、表示するために、文字列が常に期待されるので、またはとにかく9/10回です。これまでのところ、テキスト表示と選択モデルから完全なプラットフォームオブジェクトの両方を取得することは不可能のようです(私は両方を個別に行うことができます..かなり役に立たない..)

4

1 に答える 1