Трудности с модельным представлением - PullRequest
0 голосов
/ 23 ноября 2011

У меня есть древовидная структура, в которой я хотел бы отображать файлы, выбранные пользователем с помощью 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();
    }
};

И я также предоставил этот класс в качестве модели в виде дерева.В этом классе есть проблема с индексным методом - я не знаю, что возвращать.
Может кто-нибудь помочь мне и подсказать, как заставить его работать, чтобы файлы, выбранные пользователем, отображались в виде дерева?

1 Ответ

2 голосов
/ 23 ноября 2011

Прежде всего, нет никаких оснований для использования QStringList*.Qt использует неявное совместное использование , поэтому эффективно передать его в качестве аргумента (не забывайте, что QStringList - не более чем QList<QString>).

Во-вторых, вы должны просмотреть превосходный QtМодель / Просмотр документации по программированию.

Количество строк и столбцов

Вы пытаетесь создать модель дерева, поэтому вам следует внимательно прочитать пример модели дерева .Обратите внимание, что функции rowCount и columnCount имеют в качестве аргумента модельный индекс.

Функция rowCount () просто возвращает количество дочерних элементов для элемента, соответствующего данному модельному индексу, или количество элементов верхнего уровня, если указан недопустимый индекс

и для количества столбцов

Поскольку каждый элемент управляет своими собственными данными столбца, функция columnCount() должна вызвать собственную функцию columnCount() элемента, чтобы определить, сколько столбцов присутствует.для данного модельного индекса.Как и в случае функции rowCount(), если указан неверный модельный индекс, количество возвращаемых столбцов определяется из корневого элемента

Так что вам нужно подумать, как ваш список строк будет представлен в виде деревамодель.Какие у вас будут столбцы и что там будет храниться для каждого уровня?Как будет иерархия строк?Почему вы используете в качестве столбца количество строк?

Индекс модели

Когда вы переопределяете функцию index(), вам просто нужно проверить, являются ли предоставленные строка и столбец действительными, и если да, вы должны вызвать createIndex функция.Опять же, все зависит от того, какие данные содержит ваша модель и как вы их структурировали.Поскольку вы хотите реализовать древовидную модель, вы должны принять во внимание и родительский элемент.

При переопределении этой функции в подклассе вызовите createIndex () для генерации модельных индексов, которые другие компоненты могут использовать для ссылки на элементы в вашей модели.

...