2011-11-23 2 views
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(); 
} 

    signals: 

    public slots: 

    }; 

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

ответ

2

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

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

строки и столбцы граф

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

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

и для столбца подсчитывать

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

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

Index Модель

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

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

+0

[Пожалуйста, не злоупотребляйте форматированием кода] (https://meta.stackexchange.com/q/135112/349538) –

Смежные вопросы