- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的问题是,在使用时
QStandarditemmodel::setData(const QModelIndex &index, const QVariant &value, int role)
似乎这个角色从未发出过。
例子:
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
QStandardItemModel *model = new QStandardItemModel();
QList<QStandardItem*> itemList;
itemList.append(new QStandardItem());
model->appendRow(itemList);
connect(model, SIGNAL(dataChanged(QModelIndex,QModelIndex,QVector<int>)), this, SLOT(myslot_dataChanged(QModelIndex,QModelIndex,QVector<int>)));
model->item(0,0)->setData("supercool value", Qt::DisplayRole); // // should emit 1 role, but 0 are arriving
model->item(0,0)->setData("another supercool value", Qt::UserRole); // // should emit 1 role, but 0 are arriving
QVector<int> roles;
roles.append(Qt::DisplayRole);
roles.append(Qt::UserRole);
emit model->dataChanged(model->index(0,0), model->index(0,0), roles); // works. roles.count() == 2
}
MainWindow::myslot_dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles)
{
qDebug() << roles.count();
}
给定输出:
0
0
2
预期输出:
1
1
2
我知道信号中的角色 QVector 是可选的。 Qt 是否可能以某种方式省略角色而只使用默认角色?也许我必须明确地使用正确的信号(不是那些你可以省略角色的信号......),但我不知道如何。
抱歉英语不好,谢谢你的帮助! ;)
编辑 1:进一步调查:
我已经爬过 Qt 源代码并在 qstandarditemmodel.cpp 中找到了它
void QStandardItem::setData(const QVariant &value, int role)
{
Q_D(QStandardItem);
role = (role == Qt::EditRole) ? Qt::DisplayRole : role;
QVector<QStandardItemData>::iterator it;
for (it = d->values.begin(); it != d->values.end(); ++it) {
if ((*it).role == role) {
if (value.isValid()) {
if ((*it).value.type() == value.type() && (*it).value == value)
return;
(*it).value = value;
} else {
d->values.erase(it);
}
if (d->model)
d->model->d_func()->itemChanged(this);
return;
}
}
d->values.append(QStandardItemData(role, value));
if (d->model)
d->model->d_func()->itemChanged(this);
}
当使用 setData 时,会使用不关心角色的函数 itemChanged。似乎 dataChanged 中的 roles 参数对您来说只是可选的,原生 Qt 函数从未使用过。
编辑 2:更多调查...
我单步执行了 setData 函数。这是 setData 调用 itemChanged() 时的片段:
void QStandardItemModelPrivate::itemChanged(QStandardItem *item)
{
Q_Q(QStandardItemModel);
Q_ASSERT(item);
if (item->d_func()->parent == 0) {
// Header item
int idx = columnHeaderItems.indexOf(item);
if (idx != -1) {
emit q->headerDataChanged(Qt::Horizontal, idx, idx);
} else {
idx = rowHeaderItems.indexOf(item);
if (idx != -1)
emit q->headerDataChanged(Qt::Vertical, idx, idx);
}
} else {
// Normal item
QModelIndex index = q->indexFromItem(item);
emit q->dataChanged(index, index);
}
}
如前调查所述,setData 调用 itemChanged
,后者又调用 emit q->dataChanged(index, index);
我们看到 dataChanged 省略了角色参数。这意味着我之前的猜测,即 Qt native 函数不使用角色,似乎得到了证实。
最佳答案
来自信号文档 QAbstractItemModel::dataChanged()
(我强调):
void QAbstractItemModel::dataChanged(const QModelIndex &topLeft, const QModelIndex &bottomRight, const QVector<int> &roles = ...)
[...]
The optional roles argument can be used to specify which data roles have actually been modified. An empty vector in the roles argument means that all roles should be considered modified.
如您所述,Qt 对 QStandardItemModel
的实现不关心指定哪些角色的数据已更改,而是指定应更新所有数据。
问题的答案(你没有问)是:
如果您的广告位使用一组特定的 roles
调用,您可以为此进行优化。如果roles
为空,您需要获取与您的 View 相关的所有角色的数据。
关于c++ - 信号:QStandarditemmodel::datachanged(...) 在使用 QStandarditemmodel::setData(...) 时不发出角色),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50818216/
我正在使用 Heatmap.js 库在 Google map 上创建 map 叠加层。只要我在标签中对数据进行硬编码,它就可以很好地工作。 var myLatlng = new google.map
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我知道我们应该使用setData()来更新图表的系列, 但我不知道在创建某些柱形图时如何更新该系列,因为它的系列如下所示 series: [{ name: 'Tokyo',
我正在使用 series[0].setData() 函数使用按钮更改 High Charts 图表上的系列。它确实更改了数据并更新了图表,但是当我尝试使用第二个按钮来重置我的后台数据时,似乎什么也没有
我想用两行设置我的条形数据。 不可能用 \n 来做到这一点。 我使用 MPAndroidChart 版本 v2.2.4。 我用这段代码尝试过: Bar1 = new BarEntry(20f,0,"2
我有一张 Mapbox GL map ,其中有一个图层和该图层上的多个标记,我正在尝试更新特定标记,因此我使用 setData 来仅更新一个标记,但 setData 会将整个图层标记重置为仅添加一点,
我在使用 jquery-flot(flotcharts)制作实时图表时遇到麻烦。 这是我的代码: $(document).ready(function(){ var test = function()
我没有发现这两个函数有任何区别。 使用以下 JavaScript 代码: var x = {}; $(x).bind({ setData: function (event, key, value)
我正在尝试创建一个饼图,我可以通过一个按钮在两个数据系列之间切换。 当我将值直接传递给按钮 onclick 事件上的 setData() 函数时,一切正常。参见 jsfiddle (在职的)。 但是如
当CKEditor图像中的设置数据在编辑器区域消失时。链接和其他格式都可以,所以看起来不像双引号。另外,我尝试了绝对定位和外部图像,所以这不是找不到图像的问题。 这是我的代码: function ge
我使用新版本的 CKEditor。我面临的问题是额外的段落或 当我这样做时,在数据周围添加标签 setData 。我这样做是这样的: editor.setData(editor.getData()+'
我在 JSP 页面中定义了以下文本区域: 在我的 js 文件中,我设置内容数据如下: CKEDITOR.instances.edit_subtaskstep_notes.setData("Hello
我目前正在尝试在从文件加载后使用 SetData<> 在 Texture2D 对象上手动设置纹理数据。已在启用 MipMap 的情况下创建 Texture2D。数据已从使用 DXT1 压缩保存的 .d
我正在开发我的 SMS/MMS 应用程序并使用 android 消息通知样式。我想这样做,以便当用户发送图像时,我可以使用 MessagingStyle.Message.setData(uri, mi
我已经构建了一些自定义插件,但只有一个是监听键盘的按键事件。 在代码下方,您可以看到设置事件的设置。 (这有点基本) 现在我遇到了以下问题,如果我在 instanceReady 监听器中使用 edit
我有一个 QListWidget的日历。每个QListWidgetItem在逻辑上与 Calendar 的实例相关联,这是一个属于应用程序模型端的类。 我可以使用 QListWidgetItem::s
我有一个气泡图,可以与 jQuery UI slider 一起更改图表的内容。 (“通过时间”)但是,图表上的气泡可能会按周进出图表,并且在使用 setData 更新时,它忽略任何最初不存在的新系列。
在我的 Angular 应用程序中,我正在使用 Directions api 并尝试添加从一个方向到另一个方向的路线路径。第一次发出ajax请求时,路由路径已正确创建,但从第二次开始,我看不到路由路径
我使用的是 Angular,并使用 ngModel 设置 ckeditor 的数据 - 当我们渲染时我们设置数据 editor.setData(ngModel.$viewValue); 我们尝试保留光
我正在尝试为用户上载化身到Firestore存储并返回图像URL,以将其保存为用户实例上用户的avatarUrl属性。我可以将图片成功上传到Firestore。问题与URL的接收有关。异步函数会延迟,
我是一名优秀的程序员,十分优秀!