模型观点困难

时间:2011-11-23 08:24:20

标签: c++ qt model-view

我在树视图中,我想通过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 个答案:

答案 0 :(得分:2)

首先,没有理由使用QStringList*。 Qt使用implicit sharing因此将它作为参数传递是有效的(不要忘记QStringList只不过是QList<QString>)。

其次,您应该查看优秀的Qt模型/视图编程文档。

行数和列数

您正在尝试创建树模型,因此您应该仔细阅读tree model example。请注意,rowCountcolumnCount函数将参数作为模型索引。

  

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

和列数

  

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

确定的

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

模型索引

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

  

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