Проблемы с просмотром модели

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

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


person smallB    schedule 23.11.2011    source источник


Ответы (1)


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

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

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

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

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

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

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

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

Указатель модели

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

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

person pnezis    schedule 23.11.2011