【问题标题】:Model view difficulties模型视图困难
【发布时间】:2011-11-23 08:24:20
【问题描述】:

我有一个树形视图,我希望在其中显示用户通过 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();
    }
};

我还提供了这个类作为树视图的模型。此类中的索引方法存在问题 - 我不知道要返回什么。
有人可以帮助我并指导我如何使其工作,以便用户选择的文件显示在树视图中吗?

【问题讨论】:

    标签: c++ qt model-view


    【解决方案1】:

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

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

    行数和列数

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

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

    对于列数

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

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

    模型索引

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

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

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-10
    • 2013-02-28
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多