Трудности с модельным представлением
У меня есть древовидная структура, в которой я хотел бы отображать файлы, выбранные пользователем с помощью 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 ответ
Прежде всего, нет никаких оснований для использования QStringList*
, Qt использует неявное совместное использование, поэтому эффективно передавать его в качестве аргумента (не забывайте, что QStringList
не более чем QList<QString>
).
Во-вторых, вы должны просмотреть превосходную документацию по Qt Model/View Programming.
Количество строк и столбцов
Вы пытаетесь создать модель дерева, поэтому вам следует внимательно прочитать пример модели дерева. Обратите внимание, что rowCount
а также columnCount
функции имеют в качестве аргумента модельный индекс.
Функция rowCount() просто возвращает количество дочерних элементов для элемента, соответствующего данному модельному индексу, или количество элементов верхнего уровня, если указан недопустимый индекс
и для количества столбцов
Поскольку каждый элемент управляет своими собственными данными столбца,
columnCount()
функция должна вызывать собственный элементcolumnCount()
функция для определения количества столбцов для данного модельного индекса. Как сrowCount()
функция, если указан неверный модельный индекс, количество возвращаемых столбцов определяется из корневого элемента
Поэтому вы должны подумать, как ваш список строк будет представлен в виде древовидной модели. Какие у вас будут столбцы и что там будет храниться для каждого уровня? Как будет выглядеть иерархия строк? Почему вы используете в качестве столбца количество строк?
Индекс модели
Когда вы переопределяете index()
Функция, которую вы просто должны проверить, если указанные строка и столбец действительны, и если да, вы должны вызвать createIndex
функция. Опять же, все зависит от того, какие данные содержит ваша модель и как вы их структурировали. Поскольку вы хотите реализовать древовидную модель, вы должны принять во внимание и родительский элемент.
При переопределении этой функции в подклассе вызовите createIndex() для генерации модельных индексов, которые другие компоненты могут использовать для ссылки на элементы в вашей модели.