gpt4 book ai didi

qt - 如何将 QModelIndex 与新行关联?

转载 作者:行者123 更新时间:2023-12-04 11:44:08 27 4
gpt4 key购买 nike

我做了一个 QAbstractListModel其模型索引包含一个我绝对需要的指针,以便处理数据。我像这样添加数据:

void PointListModel::addPoint(int frameNumber, QPoint const& pos)
{
PointItem *pointItem = new PointItem( frameNumber, pos );
QModelIndex newRow = this->createIndex( m_points.count(), 0, pointItem );

qDebug() << newRow.internalPointer();

beginInsertRows( newRow, m_points.count(), m_points.count() );
m_points.insert( m_points.count( ), pointItem );
endInsertRows();

emit pointAdded( pointItem, pos );
}

直到后来我才意识到 beginInsertRows 的论点要求新行的父模型索引,而不是新行的实际模型索引。

所以,此时此刻,Qt 没有给我提供 QModelIndex 的方法。与此特定行相关联。如何为这个新行创建我自己的模型索引?

最佳答案

好的,我正在重写我的答案,因为经过一些研究,我发现我弄错了。

添加新数据时,您不应该做任何特殊的事情来创建新索引。您的代码应如下所示:

PointItem *pointItem = new PointItem( frameNumber, pos );
// assume you insert a top level row, having no parent
beginInsertRows( QModelIndex(), m_points.count(), m_points.count() );
m_points.insert( m_points.count( ), pointItem );
endInsertRows();

那么你应该实现 index()按需创建索引的方法和 parent()将确定某个索引的父级的方法,但由于您有一个列表模型,它应该总是只返回 QModelIndex() .这是 a good article about creating custom models .

这是一个完整的工作示例 QAbstractListModel :
class MyModel: public QAbstractListModel {
Q_OBJECT
public:
virtual QModelIndex index(int row, int column = 0,
const QModelIndex &parent = QModelIndex()) const;
virtual int rowCount(const QModelIndex &parent = QModelIndex()) const;
virtual QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const;
void add(int i);
private:
QList<int> list;
};

void MyModel::add(int i)
{
beginInsertRows(QModelIndex(), list.size(), list.size());
list.append(i);
endInsertRows();
}

QModelIndex MyModel::index(int row, int column,
const QModelIndex &parent) const
{
return hasIndex(row, column, parent) ? createIndex(row, column, (void*)&list[row])
: QModelIndex();
}

int MyModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid())
return 0;
return list.size();
}

QVariant MyModel::data(const QModelIndex &index,
int role) const
{
if (!index.isValid())
return QVariant();
if (role != Qt::DisplayRole)
return QVariant();
return QVariant(QString::number(*static_cast<int*>(index.internalPointer())));
}

关于qt - 如何将 QModelIndex 与新行关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4812669/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com