- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试创建一个基于异步数据库 API 的列表模型。这是我希望如何使用它的 qml 示例:
ListView {
id: view;
anchors.fill: parent;
model: DatabaseModel {
id: dmodel
query: "SELECT id FROM test"
database: "toto.sqlite"
}
delegate: Label {
anchors.horizontalCenter: parent.horizontalCenter;
width: view.width / 2;
height: 30;
text: id;
color: "teal";
}
}
显然,在某些时候,我需要的不仅仅是数据库中的 ID 和标签来显示该项目。
为了能够在我的标签定义中使用“id”,我使用了这样的角色名称:
QHash<int, QByteArray> DatabaseListModel::roleNames() const
{
QHash<int, QByteArray> b = this->QAbstractItemModel::roleNames();
if (m_query != "" && m_database) {
QStringList l = m_database->currentRequestFields();
for (int i = 0; i < l.count(); ++i) {
b.insert(Qt::UserRole + i + 1, l.at(i).toLocal8Bit());
}
}
return b;
}
在这种情况下,m_database 是“toto.sqlite”的数据库 session ,m_query 是“SELECT id FROM test”。
问题是我的数据库 session 是异步的,m_database->currentRequestFields()
不能立即可用,但是我收到一个信号告诉我什么时候可用所以我想更新 roleNames 列表在这一刻而不是之前。
即使 m_database 可能看起来像一个黑盒子,我还是按照以下步骤更新模型:
void DatabaseListModel::updateModel()
{
if (m_query != "" && m_database) {
m_mutex.lock();
beginResetModel();
m_cache.clear();
QObject::connect(m_database, &CollaoDatabase::databaseReady, this, [this] (CollaoDatabase* database) {
database->setQueryStringi(m_query);
database->executei(); //currentRequestFields() becomes available
database->fetchAlli();
database->sendNotifierEventi(0); //when everything written before this line has been executed, ask the database to emit CollaoDatabase::notifierEventProcessed. It's not instant and might take a while depending on the query
});
QObject::connect(m_database, &CollaoDatabase::resultReady, this, [this] (QVariantMap result) {
if (m_cache.size() <= 0)
m_cache.reserve(m_database->currentPendingFetches() + 1);
m_cache.append(result.values());
});
QObject::connect(m_database, (void (CollaoDatabase::*)())&CollaoDatabase::notifierEventProcessed, this, [this](){
endResetModel();
//TODO: update roleNames here
m_mutex.unlock();
m_database = NULL; //as soon as stop() is called, we cannot assume the existance of this object anymore
//it is therefore safer to make it null now
});
QObject::connect(m_database, SIGNAL(notifierEventProcessed()), m_database, SLOT(stop()));
m_database->start();
}
}
最佳答案
可能满足您需求的一个想法(假设您想要一个适合该模型用户的良好 API 并且仅具有 SELECT 查询)是按以下方式构建您的查询:
所以你的简单例子看起来像
DatabaseModel {
id: dmodel
table: "test"
colums: ["id"]
database: "toto.sqlite"
}
这样您就可以尽早获得可用的列名称,以便将它们用于角色名称。
关于c++ - QAbstractListModel : update role names,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34089685/
我想测试我已经实现的一些 QAbstractListModels,使用 Qt 实验室的 ModelTest 还是使用 QTestLib 进行我自己的单元测试更好。也有人可以指出 ModelTest 实
我正在使用 QAbstractListModel 将数据公开给 QML ListView。除此之外还使用了 QML SectionScroller,它使用 get 和 data 函数。 滚动一段时间后
我在尝试使用 Qt/QML 为我的应用程序开发数据模型时遇到问题。我已经使用了一个 QAbstractListModel 来将海关数据模型从 C++ 传递到 QML,它对简单模型(例如基于字符串和 b
我从 QAbstractListModel 派生了一个类 FeedItemViewModel。我已经实现了一种在列表模型中添加项目的方法,但我不知道如何更新具有特定 ID 的项目。 代码如下: voi
我有一个 QAbstractListModel 的子类,并用 GridView 附加了这个模型子类。当我从我的子类中删除行时,GridView 会更新,但是当我在模型中插入行时,GridView 不会
我有一个从 QAbstractListModel 派生的自定义模型,它暴露给 QML。我需要支持添加新项目和删除现有项目的操作。虽然插入操作没有任何问题,但删除操作会导致应用程序在调用 endRemo
在已经实例化的 QAbstractListModel 子类中,如何在每列中添加包含数据的行,并让关联的 QListView 显示新行? 似乎唯一的方法是在我的模型中重新实现 insertRow 和 s
我试图了解人们如何选择使用 QAbstractListModel 还是 QObject 和 QQmlListProperty。 鉴于 QQmlListProperty 处理必须使用 QAbstract
我正在尝试创建一个 QAbstractListView 以与 QComboBox 一起使用,该 QComboBox 维护其包含的项目的排序列表。我在下面提供了一些示例代码来说明我的问题。当我更新列表中
我正在尝试实现 QAbstractListModel 类以显示几个类似的小部件。以下代码显示了我的问题: import sys from PyQt4 import QtCore from PyQt4
我的问题是,如何将自定义对象指定为从 QAbstractListModel 派生的模型中的角色所以当在 ListView 中可视化它时我可以访问它的成员变量。这里有一个例子是一些简单的代码示例: 这是
我正在尝试按照本教程 Models and Views: AbstractItemModel Example 子类化 QAbstractListModel 来查看 qml 中的 C++ 模型列表 这是
大家好 我已经扩展了我自己的 QAbstractListModel 来改变 QCombobox 的背景颜色。如图所示,我有两个问题。1)如第一张图片快照所示,所选项目没有出现背景颜色。2) 选择项目时
我已经在 QML 中使用 TableViewColumn 实现了 TableView,其中的一些角色如下: TableView { TableViewColumn { role
我有课MyListModel ,它继承自使用 QListView 或自定义子类显示的 QAbstractListModel。我希望列表中的每个项目都是可编辑的,并且用户能够拖放以重新排列项目的顺序(我
我在 C++ 中有一个分层(嵌套)QAbstractListModel,即 Outer 模型的项目是 Inner 模型的实例, Inner 类的项是一些 QObject 派生的 Data 实例。 Ou
我是 Qt 新手,所以请耐心等待。 我已经成功地从 StringList 和对象的 QList 填充 ListView* 我现在正在努力解决的是使用 C++ 中定义的派生 QAbstractListM
我通过继承自 QAbstractListModel 创建了一个 ListView 模型。我实现了 data(const QModelIndex &, int ) 来提供列表项背景颜色(在 Qt::Ba
我正在尝试创建一个基于异步数据库 API 的列表模型。这是我希望如何使用它的 qml 示例: ListView { id: view; anchors.fill: parent;
我正在关注 this PySide tutorial尽可能接近使用 PyQt5。当我运行我的代码时,出现此错误:ReferenceError: pythonListModel is not defin
我是一名优秀的程序员,十分优秀!