我在树视图中,我想通过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();
}
};
我还提供了这个类作为树视图的模型。这个类中的索引方法有问题 - 我不知道该返回什么 有人可以帮助我并指导我如何使其工作,以便用户选择的文件显示在树视图中?
答案 0 :(得分:2)
首先,没有理由使用QStringList*
。 Qt使用implicit sharing因此将它作为参数传递是有效的(不要忘记QStringList
只不过是QList<QString>
)。
其次,您应该查看优秀的Qt模型/视图编程文档。
行数和列数
您正在尝试创建树模型,因此您应该仔细阅读tree model example。请注意,rowCount
和columnCount
函数将参数作为模型索引。
rowCount()函数只返回子项的数量 与给定模型索引对应的项目,或者数量 如果指定了无效索引,则为顶级项目
和列数
由于每个项目都管理自己的列数据,
确定的columnCount()
函数必须调用项目自己的columnCount()
函数 确定给定模型索引存在多少列。如 使用rowCount()
函数,如果指定了无效的模型索引, 返回的列数是从根项
所以你必须考虑你的字符串列表将如何表示为树模型。你将如何拥有列以及每个级别将存储哪些列?行层次结构如何?你为什么用列数来表示字符串?
模型索引
当您重新实现index()
函数时,您只需检查提供的行和列是否有效,如果是,则应调用createIndex
函数。同样,这一切都取决于您的模型包含哪些数据以及您如何构建它们。由于您要实现树模型,因此您还必须考虑父项。
在子类中重新实现此函数时,请调用createIndex() 生成其他组件可用于引用项目的模型索引 在你的模型中。