0

file_dialog.getOpenFileNames(); を介してユーザーが選択したファイルを表示したいツリービューがあります。file_dialog は QFileDialog です。モデルクラスを作成しました:

class File_Display_Model : public QAbstractItemModel
{
    Q_OBJECT

private:
    QStringList* selected_files_;

public:
    explicit File_Display_Model(QObject *parent = nullptr,QStringList* selected_files = nullptr);

    int File_Display_Model::columnCount( const QModelIndex & parent ) const
    {
        selected_files_->count();
    }

    QVariant File_Display_Model::data(const QModelIndex & index, int role) const
    {
        if (!index.isValid())
        {
                return QVariant();
        }
        else
        {
            if (role == Qt::DisplayRole) {
                    if (index.row() == index.column())
                    {
                        return 0;
                    }
                    else
                    {
                        return selected_files_->at(role);
                    }
                }
                return QVariant();
        }
    }

    QModelIndex File_Display_Model::index(int row, int column, const QModelIndex & parent ) const
    {
         /*DUMMY - HERE I JUST DON'T KNOW WHAT TO RETURN*/
         return QModelIndex(); 
    }

    QModelIndex File_Display_Model::parent(const QModelIndex & index) const
    {
        return QModelIndex();
    }

    int File_Display_Model::rowCount( const QModelIndex & parent ) const
    {
        selected_files_->count();
    }
};

また、このクラスをツリ​​ー ビューのモデルとして提供しました。このクラスのインデックス メソッドに問題があります。何を返せばよいかわかりません。
ユーザーが選択したファイルがツリービューに表示されるように機能させる方法を教えてください。

4

1 に答える 1

2

まず第一に、 を使用する理由はありませんQStringList*。Qt は暗黙の共有QStringListを使用するため、それを引数として渡すと効率的です (それが単なる a であることを忘れないでくださいQList<QString>)。

次に、優れた Qt モデル/ビュー プログラミング ドキュメントを確認する必要があります。

行数と列数

ツリー モデルを作成しようとしているので、ツリー モデルの例を注意深く読む必要があります。rowCountおよびcolumnCount関数は引数としてモデル インデックスを持っていることに注意してください。

rowCount() 関数は、特定のモデル インデックスに対応するアイテムの子アイテムの数を返すか、無効なインデックスが指定されている場合は最上位アイテムの数を返します。

および列数について

各アイテムは独自の列データを管理するため、columnCount() 関数はアイテム独自の関数を呼び出してcolumnCount()、特定のモデル インデックスに存在する列の数を決定する必要があります。関数と同様にrowCount()、無効なモデル インデックスが指定された場合、返される列の数はルート アイテムから決定されます。

したがって、文字列リストがツリー モデルとしてどのように表現されるかを考える必要があります。各レベルでどのような列を作成し、そこに何を格納するか? 行の階層はどうなりますか? なぜ列数として文字列の数を使用しているのですか?

モデルインデックス

関数を再実装するときは、指定index()された行と列が有効かどうかを確認する必要があり、有効な場合はcreateIndex関数を呼び出す必要があります。繰り返しますが、すべてはモデルに含まれるデータとそれらをどのように構造化したかによって異なります。ツリー モデルを実装したいので、親アイテムも考慮する必要があります。

サブクラスでこの関数を再実装する場合は、createIndex() を呼び出して、他のコンポーネントがモデル内の項目を参照するために使用できるモデル インデックスを生成します。

于 2011-11-23T09:43:42.417 に答える