Qt 如何显示QAbstractListModel的单个项并在数据更改时更新Gui
我想从QabstracteModel在GUI中显示单个项及其角色。在手册中,我只能找到如何显示整个模型 显示单个项目是可行的,但是当模型中的数据发生更改时,GUI中的数据不会更新 模型在setData()函数中发出dataChanged() 模型中的对象:Qt 如何显示QAbstractListModel的单个项并在数据更改时更新Gui,qt,qml,qabstractlistmodel,Qt,Qml,Qabstractlistmodel,我想从QabstracteModel在GUI中显示单个项及其角色。在手册中,我只能找到如何显示整个模型 显示单个项目是可行的,但是当模型中的数据发生更改时,GUI中的数据不会更新 模型在setData()函数中发出dataChanged() 模型中的对象: #ifndef DATASOURCEOBJECT_H #define DATASOURCEOBJECT_H #include <QString> #include <QVariantMap> class DataS
#ifndef DATASOURCEOBJECT_H
#define DATASOURCEOBJECT_H
#include <QString>
#include <QVariantMap>
class DataSourceObject
{
public:
DataSourceObject(const int &id=0, const QString &name="", const QString &displayname="", const double &value=0.0);
DataSourceObject(const QJsonObject &obj);
int id() const;
void setId(int id);
QString name() const;
void setName(const QString &name);
QString unit() const;
void setUnit(const QString &unit);
double value() const;
void setValue(double value);
QVariantMap toMap() const;
private:
int m_id;
QString m_name;
QString m_unit;
double m_value;
};
#endif // DATASOURCEOBJECT_H
#ifndef DATASOURCEMODEL_H
#define DATASOURCEMODEL_H
#include "datasourceobject.h"
#include <QAbstractListModel>
class DataSourceModel : public QAbstractListModel
{
Q_OBJECT
public:
enum datasourceRoles {
idRole = Qt::UserRole ,
nameRole,
unitRole,
valueRole
};
explicit DataSourceModel(QObject *parent = nullptr);
void addDataSourceObject(const DataSourceObject &dataSourceObject);
Q_INVOKABLE QVariantMap get(int row) const;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
Q_INVOKABLE QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
bool setData(const QModelIndex &index, const QVariant &value,
int role = Qt::EditRole) override;
Qt::ItemFlags flags(const QModelIndex& index) const override;
QHash<int, QByteArray> roleNames() const override;
//bool checkIndex(const QModelIndex &index) const;
private:
QList<DataSourceObject> m_DataSourceObjects;
};
#endif // DATASOURCEMODEL_H
#include "datasourcemodel.h"
DataSourceModel::DataSourceModel(QObject *parent)
: QAbstractListModel(parent)
{
}
QVariantMap DataSourceModel::get(int row) const
{
return m_DataSourceObjects[row].toMap();
}
void DataSourceModel::addDataSourceObject(const DataSourceObject &dataSourceObject)
{
beginInsertRows(QModelIndex(), rowCount(), rowCount());
m_DataSourceObjects << dataSourceObject;
endInsertRows();
}
int DataSourceModel::rowCount(const QModelIndex &parent) const
{
if (parent.isValid())
return 0;
return m_DataSourceObjects.count();
}
QVariant DataSourceModel::data(const QModelIndex &index, int role) const
{
if(index.row() < 0 || index.row() >= m_DataSourceObjects.count() || !index.isValid())
return QVariant();
const DataSourceObject &dataSourceObject = m_DataSourceObjects[index.row()];
if (role == idRole)
return dataSourceObject.id();
else if (role == nameRole)
return dataSourceObject.name();
else if (role == unitRole) {
return dataSourceObject.unit();
}
else if (role == valueRole)
return dataSourceObject.value();
return QVariant();
}
bool DataSourceModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
DataSourceObject &dataSourceObject = m_DataSourceObjects[index.row()];
if (data(index, role) != value) {
if(role == idRole)
dataSourceObject.setId(value.toInt());
else if(role == nameRole)
dataSourceObject.setName(value.toString());
else if(role == unitRole)
dataSourceObject.setUnit(value.toString());
else if(role == valueRole)
dataSourceObject.setValue(value.toDouble());
emit dataChanged(index, index, QVector<int>() << role);
return true;
}
return false;
}
Qt::ItemFlags DataSourceModel::flags(const QModelIndex &index) const
{
if (!index.isValid())
return Qt::NoItemFlags;
return Qt::ItemIsEditable; // FIXME: Implement me!
}
QHash<int, QByteArray> DataSourceModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[idRole] = "id";
roles[nameRole] = "name";
roles[unitRole] = "unit";
roles[valueRole] = "value";
return roles;
}
这显示了数据的角色259(valueRole),但文本在更改时不会更新
我试图从QObject派生模型内部的对象,以使用Q_INVOKABLE,但从QObject派生时,我无法编译它。C:\Qt\5.10.0\mingw53_32\include\QtCore\qlist.h:435:Fehler:使用已删除的函数'DataSourceObject::DataSourceObject(const DataSourceObject&')
if(QTypeInfo::isLarge | | QTypeInfo::isStatic)n->v=新的T(T)
文本不会更新,因为您只复制了值,但组件之间没有绑定 一个可能的解决方案是在加载程序旁边使用一个中继器,如果指定的行是该行,则该中继器将创建一个项
组件{
id:textcomponent
正文{
文本:value.toFixed(小数位数)
}
}
中继器{
模型:数据源模型
装载机{
不动产价值:model.value
sourceComponent:index==88?textcomponent:null
}
}
你可以找到一个完整的例子
另一种可能的解决方案是将项88专门设置为Q_属性。只是为了澄清
dataSourceModel.data(dataSourceModel.index(88,0),259)
259对应于角色?为什么不使用Q_属性中的Q_属性(QString name READ name WRITE setName NOTIFY nameChanged)
在您的数据源模型中。对其余的变量也执行同样的操作。当您使用data.modelData.name
访问您的值时,这将为您创建绑定。如何在模型中使用Q_属性?你能给我举个例子吗?更正:在DataSourceObject
中使用它,就像这样需要从Qobject派生对象一样。但当它是模型的一部分时,它就不起作用了。手册或示例还显示,模型中的对象不是从QObject派生的。带有中继器的解决方案使用计时器,不适合我的嵌入式应用程序,因为在使用Q_属性时,我必须实时更新模型中的数百个项,这必须在模型中还是在对象中?要添加到Repeater解决方案中,您可以将Repeater与一起使用。这样,您就不会在不可见的Loader
项上浪费太多内存。
Text {
text: dataSourceModel.data(dataSourceModel.index(88,0),259).toFixed(decimalplaces)
}
^