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 模型/视图编程文档。

行数和列数

您正在尝试创建树模型,因此您应该仔细阅读树模型示例。请注意,rowCountandcolumnCount函数有一个模型索引作为参数。

rowCount() 函数只返回与给定模型索引对应的项目的子项目数,或者如果指定了无效索引,则返回顶级项目数

和列数

由于每个项目都管理自己的列数据,因此该columnCount() 函数必须调用项目自己的columnCount()函数来确定给定模型索引存在多少列。与rowCount()函数一样,如果指定了无效的模型索引,则返回的列数从根项确定

因此,您必须考虑如何将您的字符串列表表示为树模型。您将拥有哪些列以及每个级别将存储哪些列?行层次结构如何?你为什么使用列数来计算字符串的数量?

型号索引

当您重新实现该index()函数时,您只需检查提供的行和列是否有效,如果是,则应调用该createIndex函数。同样,这完全取决于您的模型包含哪些数据以及您如何构建它们。由于您要实现树模型,因此还必须考虑父项。

在子类中重新实现此函数时,调用 createIndex() 以生成模型索引,其他组件可以使用这些索引来引用模型中的项目。

于 2011-11-23T09:43:42.417 回答