(const QModelIndex &parent=QModelIndex()) const; QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const; QModelIndex parent(const QModelIndex &child=QModelIndex()) const; createIndex(row,column) :QModelIndex(); } QModelIndex MediaListModel::parent(const QModelIndex (const QModelIndex &parent=QModelIndex()) const; QModelIndex index(int row, int column, const QModelIndex &parent=QModelIndex()) const; QModelIndex parent(const QModelIndex &child=QModelIndex()) const;
QModelIndex setRootPath(const QString &path) 设置根路径,并返回表示新路径的模型索引。 QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const获取模型索引。 QModelIndex parent(const QModelIndex &index) const 获取给定索引的父索引。 int rowCount(const QModelIndex &parent = QModelIndex()) const获取给定父索引下的行数。 int columnCount(const QModelIndex &parent = QModelIndex()) const获取给定父索引下的列数。
其中index()是个重载函数,用来获取QModelIndex 索引值,完整的index()函数如下所示: QModelIndex QAbstractItemModel::index ( int row , int column, const QModelIndex & parent = QModelIndex() ); //返回指定的row(行)、column(列)、parent(父索引 ( const QModelIndex & index ) ; //通过索引值获取文件名 QString filePath ( const QModelIndex & index ) ; / const QModelIndex & parent = QModelIndex() ) ; //通过索引值获取当前列数 int rowCount ( const QModelIndex & parent = QModelIndex() ) ; //通过索引值获取行数 QModelIndex parent ( const QModelIndex & index ) ; //通过索引值获取其父节点的索引值
QAbstractItemModel类中定义如下: Q_INVOKABLE virtual QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const = 0; Q_INVOKABLE virtual QModelIndex parent(const QModelIndex &child) ; Q_INVOKABLE virtual int rowCount(const QModelIndex &parent = QModelIndex()) const = 0; Q_INVOKABLE QModelIndex TreeModel::index(int row, int column, const QModelIndex &parent) const { if (! QModelIndex TreeModel::parent(const QModelIndex &index) const { if (!
&parent = QModelIndex()) const Q_DECL_OVERRIDE ; int columnCount(const QModelIndex &parent = QModelIndex ()) const Q_DECL_OVERRIDE; QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const Q_DECL_OVERRIDE; bool setData(const QModelIndex & index, const QVariant & value, int role = Qt: :EditRole) Q_DECL_OVERRIDE; Qt::ItemFlags flags(const QModelIndex & index) const Q_DECL_OVERRIDE index参数会告诉我们具体哪个单元格被编辑、value参数可以让我们获得单元格内具体的内容 bool MyModel::setData(const QModelIndex & index, const
indexA = model.index(0,0,QModelIndex()); qDebug()<<"indexA row count:"<<model.rowCount(indexA); QModelIndex indexB = model.index(0,0,indexA); qDebug()<<"indexB text:"<<model.data(indexB,Qt: )),&list,SLOT(setRootIndex(QModelIndex)) ); QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex topLeft = m_tableView->model()->index(0,0,QModelIndex()); //右下角模型索引 QModelIndex bottomRight (QModelIndex())-1,QModelIndex()); //项选择 QItemSelection curSelection(topLeft,bottomRight);
bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex index); signals: public slots: private: void showMsg(QString str); private: typedef QMap<QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &parent) const { return m_data.size(); } int TableModel::columnCount(const QModelIndex &parent) const { return m_HorizontalHeader.count(); } QVariant TableModel::data(const QModelIndex &index
int column, const QModelIndex &parent=QModelIndex()) const 这里,我们仅仅使用了前两个参数 因此,我们只需提供两个参数即可获取到表格中的某一个数据项: 1 2 3 QModelIndex indexA = model->index(0, 0, QModelIndex()); QModelIndex indexB = model->index(1, 1, QModelIndex()); QModelIndex indexC = model->index(2, 1, QModelIndex()); 函数的最后一个参数始终是 QModelIndex(),接下来我们就要讨论这个参数的含义。 图中,A 和 C 都是模型中的顶级项: 1 2 QModelIndex indexA = model->index(0, 0, QModelIndex()); QModelIndex indexC
QObject *parent=0); void setCurrencyMap(const QMap<QString,double> &map); int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex section, Qt::Orientation orientation, int role) const; //可编辑模型实现 Qt::ItemFlags flags(const QModelIndex &index)const; bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole &parent) const { return currencyMap.count(); } //返回列数目 int CurrencyModel::columnCount(const QModelIndex
model Q_INVOKABLE void clear(); //虚函数 qml内部调用 获取第index行的内容 role 内容索引 QVariant data(const QModelIndex &index, int role =Qt::DisplayRole) const; //虚函数 获取model行数 int rowCount(const QModelIndex &parent = QModelIndex() ) const; // 虚函数 内容的别名 qml 内部调用 //QHash<int, QByteArray> roleNames() const parent) :QAbstractListModel(parent) { } void ToolTagModel::Add(ToolTag& tt) { beginInsertRows(QModelIndex parent) const { Q_UNUSED(parent); return m_datas.size(); } QVariant ToolTagModel::data(const QModelIndex
QModelIndex index(int row, int column, const QModelIndex & parent = QModelIndex()) const 返回指定行、列和父索引的模型索引 QModelIndex parent(const QModelIndex & child) const 返回指定子索引的父索引。 int rowCount(const QModelIndex & parent = QModelIndex()) const 返回给定父索引下的行数。 int columnCount(const QModelIndex & parent = QModelIndex()) const 返回给定父索引下的列数。 bool insertRows(int row, int count, const QModelIndex & parent = QModelIndex()) 在给定父索引下的 row 位置处插入 count
()), QVariant(u'树袋熊')) comboModel.setData(comboModel.index(0, 1, QModelIndex()), QVariant(u'生活在树上的熊 ')) comboModel.setData(comboModel.index(1, 0, QModelIndex()), QVariant(u'松鼠')) comboModel.setData (comboModel.index(1, 1, QModelIndex()), QVariant(u'可爱的松树精灵')) comboModel.setData(comboModel.index(2 , 0, QModelIndex()), QVariant(u'大眼猴')) comboModel.setData(comboModel.index(2, 1, QModelIndex()), QVariant (comboModel.index(3, 1, QModelIndex()), QVariant(u'夜的精灵正站在树枝上')) model = QStandardItemModel(2, 3, table
QAbstractItemDelegate类中的关键虚函数 QWidget * createEditor( QWidget * parent, QStyleOptionViewItem & option, QModelIndex 更新编辑组件大小,保证editor显示的位置及大小 //大小可以通过option.rect获取数据项窗口大小 void setEditorData ( QWidget * editor, const QModelIndex void paint ( QPainter * painter, const QStyleOptionViewItem & option, const QModelIndex & index ) ; / & index ) const ; void setEditorData( QWidget * editor, const QModelIndex & index ) const ; void setModelData( QWidget * editor, QAbstractItemModel * model, const QModelIndex & index
QObject *parent=0); void setCurrencyMap(const QMap<QString,double> &map); int rowCount(const QModelIndex &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex section, Qt::Orientation orientation, int role) const; //可编辑模型实现 Qt::ItemFlags flags(const QModelIndex &index)const; bool setData(const QModelIndex &index, const QVariant &value, int role=Qt::EditRole &parent) const { return currencyMap.count(); } //返回列数目 int CurrencyModel::columnCount(const QModelIndex
(QObject *parent = 0); void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index); signals: public slots: private: QMap<QModelIndex, QStyleOptionButton*> m_btns; }; &parent) const; int columnCount(const QModelIndex &parent) const; QVariant data(const QModelIndex &parent) const { return m_data.size(); } int TableModel::columnCount(const QModelIndex &parent) const { return m_HorizontalHeader.count(); } QVariant TableModel::data(const QModelIndex &index
QModelIndex 深度解析核心功能与内存布局// 索引结构示例(伪代码)struct QModelIndex { int row; // 行号(从0开始) int column TreeModel::parent(const QModelIndex& child) const { if (! parent(const QModelIndex& child) const override { if (! 指针失效防护技巧// 安全索引转换方法Node* TreeModel::getNode(const QModelIndex& index) const { if (! 所有权管理策略// 安全节点删除实现void TreeModel::removeNode(const QModelIndex& index) { if (!
; //设置编辑器的数值}void QWIntSpinDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex QWIntSpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex QWFloatSpinDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex QWidget *QWComboBoxDelegate::createEditor(QWidget *parent,const QStyleOptionViewItem &option, const QModelIndex QWComboBoxDelegate::updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex
在 QTableView、QListView 等控件中,QModelIndex 用来唯一标识模型中的一个元素,以便于获取和操作该元素的数据。QModelIndex 的主要作用包括:1. 定位元素:通过 QModelIndex 可以获取到模型中指定位置的元素,例如获取第一行的第一个单元格的 QModelIndex。2. 操作元素:通过 QModelIndex 可以对模型中对应元素进行操作,例如修改文本内容或更改图片资源。在使用 QModelIndex 时,需要注意以下几点:1. QModelIndex 是一个轻量级对象,可以在多个地方传递和使用,而不会增加内存开销。2. QModelIndex 不包含任何数据本身,它只是一个指向模型中某个节点的指针。 因此,在使用 QModelIndex 时,需要确保它指向的是一个有效的节点。3. QModelIndex 是不可变的,即不能直接修改它的属性。
通过index可以获取行号和列号 bool setData(const QModelIndex &index, const QVariant &value, int role); //将index单元格下的 如果要实现的话,则需要覆写下面函数: Qt::ItemFlags flags(const QModelIndex &index); //设置每个单元格的flag,对于可编辑模型,必须重写它,添加Qt: &parent = QModelIndex()) const; int columnCount(const QModelIndex &parent = QModelIndex()) const &index, int role = Qt::DisplayRole) const; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole); Qt::ItemFlags flags(const QModelIndex &index) const; void
,QModelIndex可以看做是QStandardItem的数据封装,知道 QModelIndex就可以知道QStandardItem,通过QStandardItemModel的 itemFromIndex 函数即可得到QModelIndex对应的QStandardItem。 (int row, int column, const QModelIndex & index) 和 QModelIndex QModelIndex::sibling(int row, int column) const 都可以用于获取兄弟节点信息 例如把 on_treeView_clicked ( const QModelIndex & index )的代码改一下 getTopParent(QModelIndex itemIndex){ QModelIndex secondItem = itemIndex; while(itemIndex.parent