QML,如何从c++中动态更改中继器的项
QML,How to dynamicaly change Item of Repeater from C++
我在网格上有QML中继器,当我点击项目时,我发出由c++类处理的信号,然后在c++中更改数组,然后将其指定为QML中继器的模型。是否有一种方法可以改变c++模型的两个元素,而不是像我那样改变整个模型?
这是我的QML文件
Grid{
height:width
rows:8
columns: 8
Repeater{
id: chessPiecesRptr
...
signal chessfigureSelected(int index)
delegate: Item{
id:chessPiecesItm
Image{
...
}
MouseArea
{
anchors.fill:parent
onClicked: {
chessPiecesRptr.chessfigureSelected(index)
}
}
}
}
更新QML中继器模型的c++方法
void ChessFiguresClass::changeModel()
{
QStringList dataList;
for(int i=0;i<64;i++)
dataList.append(QChar(posArray[i]));
QQmlProperty::write(chessPiecesRptr, "model", QVariant::fromValue(dataList));
}
与公认的答案相反,确实有可能不去实现整个QAbstractListModel
。
确实,QStringList
没有任何通知更改的方法,但你所要做的就是把它包装在一个属性中,就像这样:
Q_PROPERTY(QVariant myModel READ myModel NOTIFY myModelChanged)
...
QVariant myModel() { return QVariant::fromValue(myStringList); }
...
void myModelChanged(); // signal
并且每次您想要反映模型的变化时,无论是用不同的模型替换它还是内部更改它,都要发出myModelChanged
。并将myModel
属性用于Repeater
的模型。
然而,如果你在模型中有很多项目,或者委托很复杂,实现你自己的QAbstractListModel
总是一个好主意,因为用上面的方法,重复器每次"改变"时都会重新创建整个模型,而QAbstractListModel
只会更新实际的变化。
恐怕不行。QList(和QStringList)没有内部机制来通知Qml项它的更改。只有当QML项中的模型属性被更改时,才会再次读取整个列表。我以前遇到过同样的问题,我使用QAbstractListModel作为基类实现了一个字符串列表。标题看起来像这样:
#ifndef _SIMPLEMODEL_H_
#define _SIMPLEMODEL_H_
#include <QtCore>
class SimpleStringModel : public QAbstractListModel
{
Q_PROPERTY(int count READ count NOTIFY countChanged)
Q_DISABLE_COPY(SimpleStringModel)
Q_OBJECT
public:
explicit SimpleStringModel(QObject* parent = 0);
SimpleStringModel(const QList<QString>& initList, QObject* parent = 0);
virtual ~SimpleStringModel();
private:
enum Roles{
ModelDataRole = Qt::UserRole+1
};
public:
int count() const;
public:
void append(const QString& item);
void insert(int index, const QString& item);
void append(const QList<QString>& items);
void insert(int index, const QList<QString>& items);
bool removeOne(const QString& item);
int removeAll(const QString& item);
void removeAt(int index);
QList<QString> list() const;
signals:
void countChanged();
// QAbstractItemModel interface
public:
virtual int rowCount(const QModelIndex &parent) const;
virtual QVariant data(const QModelIndex &index, int role) const;
virtual QHash<int, QByteArray> roleNames() const;
private:
QList<QString> m_data;
};
#endif //_SIMPLEMODEL_H_
你可以在这里得到所有的代码。我希望这对你有帮助。
相关文章:
- 如何在 C++ 中获取中继器的委托数据?
- 实现动态插件管理器
- 如果同时存在共享库和动态库,则链接器将首选哪个库?
- aarch64动态链接器rpath使用辅助依赖链接
- C/C++函数动态加载器(helper)
- OpenGL 中的动态加载着色器毫无意义吗?
- 使用C++清理器测量动态内存使用情况
- 在存储库中,筛选器函数返回动态向量或其他存储库
- 地址清理器和运行时加载动态库 ->(<未知模块>)
- 如何在C 构建器中动态声明C#DLL
- C - 使用静态和动态库时解决链接器错误
- 从高度动态的C 数据模型中更新QML:计时器与属性绑定
- RDP动态虚拟通道 - 创建多个侦听器
- 如何为 OpenCV 的视频编写器动态选择可用的编解码器?
- 中继器内的QML列表视图
- Qt设计器 - 动态生成UI/生成唯一名称
- QtQuick2和C++:使用中继器
- QML,如何从c++中动态更改中继器的项
- OpenCL - c++包装器-动态库中的上下文取消初始化导致访问冲突
- QList<int> 不能用作中继器的模型