gpt4 book ai didi

c++ - 在不使用就地编辑的情况下更改 Qt AbstractListModel

转载 作者:行者123 更新时间:2023-11-28 00:34:54 25 4
gpt4 key购买 nike

我目前有一个 QtAbstractListModel 子类(为清楚起见缩短):

class HolidayTask;

class HolidayTaskModel: public QAbstractListModel
{
Q_OBJECT
public:
explicit HolidayTaskModel(QObject *parent = 0);
~HolidayTaskModel();

int rowCount(const QModelIndex& parent = QModelIndex()) const;
QVariant data(const QModelIndex& index, int role = Qt::DisplayRole) const;
Qt::ItemFlags flags(const QModelIndex& index) const;

bool insertRows(int row, int count, const QModelIndex& parent = QModelIndex());
bool removeRows(int row, int count, const QModelIndex& parent = QModelIndex());

bool setData(const QModelIndex& index, const QVariant& value,
int role = Qt::EditRole);

private:
QVector<HolidayTask*> m_items;

};

HolidayTask 是我包含的项目。我试图弄清楚这个用例需要重新实现什么:

  1. 模型是可修改的,但不能在 View 中进行就地编辑:另一个小部件(不是 *View 子类)将进行编辑,该模型将显示在 View 之外;
  2. 它不仅需要实现追加(这很容易),还需要实现插入和重新排序。

在追加的情况下,制作一个调用beginInsertRowsendInsertRowsappendTask 函数会很容易,但是至少插入和/或删除并不那么微不足道。

我发现的大多数代码示例都涉及就地编辑(createEditor 等),正如我在上面所写,这不是我所需要的。我应该实现什么来修改此模型以完成此任务?或者,是否有任何代码示例可以展示这种作案手法?

最佳答案

如果您不需要使用 View 编辑模型数据,则不需要实现insertRowsremoveRowssetData .相反,您应该创建自己的修改函数,例如add_task(HolidayTask* task)set_task(int row, HolidayTask* task)remove_task(int row)。在这些函数中,您需要更改 m_items 值以反射(reflect)数据更改。 (此外,如果您需要从列表中间快速插入和删除,您应该从 QVector 切换到 QList)。此外,您应该通知有关更改的 View :

  • 在删除行之前调用 beginRemoveRows,然后调用 endRemoveRows
  • 在插入行之前调用 beginInsertRows,然后调用 endInsertRows
  • 更改数据后调用emit dataChanged(...)

关于c++ - 在不使用就地编辑的情况下更改 Qt AbstractListModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21348719/

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