- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有我的自定义列表模型,我在其中放置了应该显示在 QML View 上的数据。但由于某种原因,QML 中的 View 有时会正常更新,有时会使用以前的数据,有时不会执行更新。
这是我填充模型的函数 - 这个函数是从其他线程调用的。
void MyScreen::fillListModel()
{
const QString SEPARATOR = " ";
myListModel->resetModel();
for (int i = 0; i < MAX_ROWS; ++i)
{
QString key = QString::fromUtf16(MyData::getParameterKey(i).c_str());
QString val = QString::fromUtf16(MyData::getParameterVal(i).c_str());
myListModel->addItem(key + SEPARATOR + val);
}
}
模型重置的实现:
void BrowsingModelBase::resetModel()
{
beginResetModel();
m_items.clear();
endResetModel();
}
addItem()
的实现:
void BrowsingModelBase::addItem(const BrowsingItemModelBase &item)
{
int count = m_items.size();
beginInsertRows(QModelIndex(), count, count);
m_items.append(item);
endInsertRows();
}
最后是我的 QML 文件:
MyScreen {
Column {
id: myFlowList
y: 110
x: 220
ListView {
height:1000
spacing: 35;
model: myListModelRoot.myListModel
delegate: Text {
text: text1
}
}
}
}
奇怪的是在循环之后用line
myListModel->addItem(key + SEPARATOR + val);
当我使用 myListModel
中的数据打印日志时,它会填充适当的数据,但 View 通常会使用以前的数据进行更新。数据更改信号是否有可能卡在某处?知道解决方案是什么吗?
最佳答案
假设您从另一个线程调用模型的方法,并且该模型从根本上不是线程安全的,您有两个选择:
使模型的某些方法线程安全,或者
以线程安全的方式显式调用方法。
但首先,您可以通过一次添加所有项目作为一个单元来获得一点性能。这样一来,模型将只为所有行发出一个信号,而不是每行发出一个信号。意见将非常感激。
class BrowsingModelBase {
...
};
Q_DECLARE_METATYPE(QList<BrowsingItemModelBase>)
void BrowsingModelBase::addItems(const QList<BrowsingItemModelBase> & items)
{
beginInsertRows(QModelIndex(), m_items.size(), m_items.size() + items.size() - 1);
m_items.append(items);
endInsertRows();
}
您可能还应该有一个名为 clear
的方法,而不是 resetModel
,因为重置模型具有更普遍的含义:“改变它太多以至于它不是值得发出个人变革信号”。重置模型并不意味着“清除它”!因此:
void BrowsingModelBase::clear()
{
beginResetModel();
m_items.clear();
endResetModel();
}
最后,按照第二种安全调用模型方法的方法,fillListModel
变成如下。参见 this answer for discussion of postTo
.
template <typename F>
void postTo(QObject * obj, F && fun) {
if (obj->thread() != QThread::currentThread()) {
QObject signalSource;
QObject::connect(&signalSource, &QObject::destroyed, obj, std::forward<F>(fun));
} else
fun();
}
void MyScreen::fillListModel()
{
auto separator = QStringLiteral(" ");
QList<BrowserItemModelBase> items;
for (int i = 0; i < MAX_ROWS; ++i) {
auto key = QString::fromUtf16(MyData::getParameterKey(i).c_str());
auto val = QString::fromUtf16(MyData::getParameterVal(i).c_str());
items << BrowserItemModelBase(key + separator + val);
}
postTo(myListModel, [this, items]{
myListModel->clear();
myListModel->addItems(items);
});
}
或者,按照第一种方法,您可以使 clear
和 addItems
方法线程安全:
/// This method is thread-safe.
void BrowsingModelBase::addItems(const QList<BrowsingItemModelBase> & items)
{
postTo(this, [this, items]{
beginInsertRows(QModelIndex(), m_items.size(), m_items.size() + items.size() - 1);
m_items.append(items);
endInsertRows();
});
}
/// This method is thread-safe.
void BrowsingModelBase::clear()
{
postTo(this, [this]{
beginResetModel();
m_items.clear();
endResetModel();
});
}
然后您不需要更改 fillListModel
,除了让它使用 addItems
:
void MyScreen::fillListModel()
{
auto separator = QStringLiteral(" ");
myListModel->clear();
QList<BrowserItemModelBase> items;
for (int i = 0; i < MAX_ROWS; ++i) {
auto key = QString::fromUtf16(MyData::getParameterKey(i).c_str());
auto val = QString::fromUtf16(MyData::getParameterVal(i).c_str());
items << BrowserItemModelBase(key + separator + val);
}
myListModel->addItems(items);
}
关于qt - 自定义 listModel 不通知 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32082901/
我有两个 ListModel:listModelRight 和 listModelLeft。我只是想要 listModelRight = ListModelLeft,但即使这样也不起作用。我该怎么做?
我需要创建一个 ListModel , 静态地包含一个对象(字符串和 bool 值)。 如果我添加到一个空 ListModel元素通过使用 append - 一切正常。 property ListMo
所以我正在制作一个包含这段代码的程序 final ListModel listModel = new DefaultListModel(); JButton btnBuscar = new JButt
如何将菜单添加到具有适当操作的列表模型中? 我见过这样的代码: list menu: [ :menu | menu add: 'Name' action: [ "some acti
我有以下 C++ 模型结构: Manager // QAbstractListModel ↪ Slot // QAbstractListModel
当我单击一个按钮(例如 mainBtn),然后在 MealList 中选择一个字符串,然后单击另一个按钮(例如 starterBtn)时,控制台中会抛出错误。如果有人可以将我推向正确的方向并告诉我为什
我有一个 JList,它使用列表模型将文本字符串添加到 JList。我无法弄清楚如何更新选定的 listModel。我可以选择 listModel 字符串(我已验证我选择的内容是否正确返回),但我无法
我不知道为什么会发生这种情况,如果需要的话我会查看代码的其他部分,但我真的更喜欢它是其他东西...... 假设我的 JList 中有以下项目 Beer Mercedes Coca Cola 并且 st
我可以保存使用 Component.onComponent 静态创建的列表项的设置方法。但是静态创建的列表项的设置会在重新打开应用程序后生效。我想保存动态创建的列表模型的设置。我无法保存动态创建的列表
我有一个TableView动态填充 ListModel我需要在“QML 端”进行排序,最好不要替换列表中的任何元素,因为几个表信号(包括一些自定义信号)附加了相当多的逻辑。 我遇到的问题是,当表增长超
在 Codenameone 中,我使用列表作为容器渲染器来形成,在使用 hastable 解析 JSON 数据后,我在列表的项目上显示结果。该列表包含 hastable 已通过 ListModel它工
我想要一个 Swipeview,在一个 swipeview 中有一个小部件(按钮)列表。一切都必须动态创建,因为可以有一个或五个屏幕,或者一个或更多小部件。它可以通过抽屉添加(将来)。在抽屉上添加屏幕
我正在尝试创建我的第一个列表,但遇到错误。 这是我用于列表模型的模板: private ListModel getListModel() { String[] arrayOfStrin
假设我们有一个名为 JList1 的列表。 我们要为它创建一个模型,所以我们当然要使用一个ListModel对象。这就是应该做的。 DefaultListModel numbers = new Def
我想知道如何在 ListModel 中传递数组? 好的,在 QML 中,我有一个 ListView,我将其设置为 ListModel,如下所示: model: ListModel { id:
我想构建多个 ListModel,它们都将以公共(public)元素开头。我想填充另一个 ListModel 中的剩余元素。 例子:列表模型(一): COMMON A COMMON B COMMON
我有我的自定义列表模型,我在其中放置了应该显示在 QML View 上的数据。但由于某种原因,QML 中的 View 有时会正常更新,有时会使用以前的数据,有时不会执行更新。 这是我填充模型的函数 -
我在获取 ListModel 的所有元素时遇到问题,当我尝试将字符串写入文件时,它们输出如下所示的内容: [Ljava.lang.String;@79b43f[Ljava.lang.String;@7
我正在构建一个应用程序,它基本上只是一个用于显示和编辑单个对象的 GUI。由于该对象的类是使用 JAXB 创建的,它基本上是一棵有许多字符串和整数作为子项的树,但也有一些 List s。对于每个简单的
我的最终目标是拥有两个 JList,用户可以在它们之间来回移动元素。我使用 TreeSet 以便按字母顺序插入元素。这是一个直观的表示: 下面是我迄今为止的代码,位于 SSCCE 中。它大部分工作正常
我是一名优秀的程序员,十分优秀!