- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我使用 Qt example for QAbstractItemModel
我尝试更新 Item
到给定的 index
.
我尝试使用 emit DataChanged
但它不起作用, View 未更新 .
下面是一个例子:
我要什么 :当你点击按钮时,它会更新索引 0 处的数据 , type
动物的会被改变,它会变成狮子 .
#include <QAbstractListModel>
#include <QStringList>
#include <qqmlcontext.h>
//![0]
class Animal
{
public:
Animal(const QString &type, const QString &size);
//![0]
QString type() const;
QString size() const;
void setType(QString q) {
m_type = q;
}
private:
QString m_type;
QString m_size;
//![1]
};
class AnimalModel : public QAbstractListModel
{
Q_OBJECT
public:
Q_INVOKABLE void test() ;
void setName(const QString &name);
enum AnimalRoles {
TypeRole = Qt::UserRole + 1,
SizeRole
};
AnimalModel(QObject *parent = 0);
//![1]
//!
//!
void setContext(QQmlContext *ctx) {
m_ctx = ctx;
}
void addAnimal(const Animal &animal);
int rowCount(const QModelIndex & parent = QModelIndex()) const;
QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
QHash<int, QByteArray> roleNames() const;
protected:
private:
QList<Animal> m_animals;
QQmlContext* m_ctx;
signals:
void dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight);
//![2]
};
//![2]
#include "model.h"
#include "qDebug"
Animal::Animal(const QString &type, const QString &size)
: m_type(type), m_size(size)
{
}
QString Animal::type() const
{
return m_type;
}
QString Animal::size() const
{
return m_size;
}
AnimalModel::AnimalModel(QObject *parent)
: QAbstractListModel(parent)
{
}
void AnimalModel::addAnimal(const Animal &animal)
{
beginInsertRows(QModelIndex(), rowCount(), rowCount());
m_animals << animal;
endInsertRows();
}
void AnimalModel::test() {
m_animals[0].setType("Lion");
emit dataChanged(QModelIndex(),QModelIndex());
//I also tried:
QModelIndex topLeft = createIndex(0,0);
emit dataChanged(topLeft, topLeft);
}
int AnimalModel::rowCount(const QModelIndex & parent) const {
Q_UNUSED(parent);
return m_animals.count();
}
QVariant AnimalModel::data(const QModelIndex & index, int role) const {
if (index.row() < 0 || index.row() >= m_animals.count())
return QVariant();
const Animal &animal = m_animals[index.row()];
if (role == TypeRole)
return animal.type();
else if (role == SizeRole)
return animal.size();
return QVariant();
}
//![0]
QHash<int, QByteArray> AnimalModel::roleNames() const {
QHash<int, QByteArray> roles;
roles[TypeRole] = "type";
roles[SizeRole] = "size";
return roles;
}
//![0]
#include "model.h"
#include <QGuiApplication>
#include <qqmlengine.h>
#include <qqmlcontext.h>
#include <qqml.h>
#include <QtQuick/qquickitem.h>
#include <QtQuick/qquickview.h>
//![0]
int main(int argc, char ** argv)
{
QGuiApplication app(argc, argv);
AnimalModel model;
model.addAnimal(Animal("Wolf", "Medium"));
model.addAnimal(Animal("Polar bear", "Large"));
model.addAnimal(Animal("Quoll", "Small"));
QQuickView view;
view.setResizeMode(QQuickView::SizeRootObjectToView);
QQmlContext *ctxt = view.rootContext();
ctxt->setContextProperty("myModel", &model);
//![0]
view.setSource(QUrl("qrc:view.qml"));
view.show();
return app.exec();
}
import QtQuick 2.0
import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Window 2.2
import QtQuick.Dialogs 1.2
import QtQuick.Layouts 1.2
import QtQml.Models 2.1
import QtQuick.Controls.Styles 1.2
//![0]
ListView {
width: 200; height: 250
model: myModel
delegate: Text { text: "Animal: " + type + ", " + size }
MouseArea {
anchors.fill: parent
cursorShape: Qt.PointingHandCursor
onClicked: {
}
}
Button {
anchors.bottom: parent.bottom
width:50; height:50
text:"click"
onClicked: {
myModel.test()
}
}
}
//![0]
最佳答案
不要在子类中重新定义信号。
删除以下几行(在 model.h 中),它应该按预期工作:
signals:
void dataChanged(const QModelIndex & topLeft, const QModelIndex & bottomRight);
dataChanged()
你必须指定一个有效的
QModelIndex
.这是对的 :
// I also tried:
QModelIndex topLeft = createIndex(0,0);
emit dataChanged(topLeft, topLeft);
关于qt - 更新数据时如何更新 QAbstractItemModel View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43494905/
我需要在 PyQt 中将 QAbstractItemModel 与 QTreeView 一起使用。 在 dropMimeData 方法中,我想删除源行(如果它是某个 MIME_TYPE。)如何获取源的
我有一个 map = std::map ,其中 myItemModel继承QAbstractItemModel . 我现在要合并所有 myItemModel合一myItemModel (其他所有元素模
我的 QAbstractItemModel 的实现正在监听一些事件,并在单独的线程中处理更新。 处理更新可能会导致模型中的布局和/或数据更改。 数据本身的存储是boost::mutex - prote
你好来自 SO 的好人! 今天我一直在问自己很多关于我试图实现的事情。 说到这里,我正在尝试使用 Qt 编写某种终端代码,它将用于显示来 self 的应用程序不同部分的消息。 现在我实现了一个模型类(
我为我的模型继承了 QAbstractItemModel 类。为了轻松地将新项目插入模型,我编写了下一个方法: void addItem(MyData *parent, MyData *childre
在创建项目模型时,例如通过子类化 QAbstractItemModel,是否要嵌套行插入和删除等基本操作? 例如,在实践中,必须在调用 ::beginInsertRows() 之后立即调用 ::end
我仍然很难理解 QAbstractItemModel 的项目表示。有两种方法可以返回 QModelIndex 项目,这对我来说没有任何意义。 QModelIndex QAbstractItemMode
我正在研究 QAbstractItemModel 的子类插入 QTreeView .它有一个递归Name = Value类型结构 - 任何索引都可以有自己的子树。这在左侧很好,因为几乎所有的 Tree
一起使用 Qt 的图形 View 和模型 View 框架的最佳方法/模式是什么? 似乎 Qt 应该以某种方式将这两件事联系在一起,但没有。 QGraphicsItem 可以只保留一个 QModelIn
我正在尝试为 TreeView 实现一个简单的模型,但我不知道为什么它不起作用。似乎我所有的节点都是我的 的子节点。根节点,尽管其中三个应该是它的子节点 第一 child 。我也可以看到我的 hasC
QAbstractItemModel 有一个 setHeaderData( int section, ..... ) 方法,该方法根据标题方向采用行或列的部分。我有一个模型,其中包含几个表,这些表都是
我正在实现一个基于 Qt 的树 View ,其中 View 是基于 QTreeView 的类,模型是基于 QAbstractItemModel 的类。这棵树应该有数百万个节点。我正在实现一种过滤机制,
我是 (Py)Qt 新手,现在将 C# GUI 代码移植到 Qt 几天了。我一直问自己的一个问题是为什么 QAbstractItemModel提供 parent() 所需的子类方法,以及为什么他们需要
我有一个关于通知模型对其存储引用的其他对象所做的更改的问题。 我知道信号 dataChanged(),但我不确定如何使用它。例如,我的模型存储了对其他对象的引用(我们称之为 myObjPtr)。只有在
我第一次尝试使用 QTreeView 与 QAbstractItemModel 并立即遇到问题。 QAbstractItemModel 接口(interface)将方法声明为 const ,假设他们不
我使用继承 (QSqlQueryModel) 制作了myModel,并且我 将列插入其中。我想插入 QString 类型的数据,但我不知道该怎么做。 QSQlQueryModel 是只读模型。要使其可
我使用 Qt example for QAbstractItemModel我尝试更新 Item到给定的 index . 我尝试使用 emit DataChanged但它不起作用, View 未更新 .
我一直在努力思考如何为 QAbstractItemModel 开发标准样式的迭代器,但我陷入了困境。我可以使用深度优先或广度优先算法搜索模型,但在将这些模式应用于迭代器时,我不确定如何进行。有人可以直
我正在基于 QAbstractItemModel 实现我的模型,并将其与 QTreeView 一起使用来显示分层数据。数据存储在sqlite表中。 我的问题是添加子节点时应该如何调用beginInse
我正在尝试基于 QAbstractItemModel 创建自己的模型。看起来效果很好。它通过了模型测试断言。 当我删除一行时,我遇到了这个奇怪的问题。删除操作正常。但随后其他行变得不可选择(并非全部)
我是一名优秀的程序员,十分优秀!