问题:如何在带有方法的QTreeView加载QAbstractItemModel模型中查找子项model->match()?
问题:model->match()找不到子项,wtf?!
这是一个例子:
alt text http://www.freeimagehosting.net/uploads/179eee87e3.png
从图中可以看出,我正在尝试Layouts使用以下代码扩展子项:
void Dialog::restoreState(void)
{
// get list
QSettings settings("settings.ini", QSettings::IniFormat);
settings.beginGroup("MainWindow");
QStringList List = settings.value("ExpandedItems").toStringList();
settings.endGroup();
foreach (QString item, List)
{
if (item.contains('|'))
item = item.split('|').last();
// search `item` text in model
QModelIndexList Items = model->match(model->index(0, 0), Qt::DisplayRole, QVariant::fromValue(item));
if (!Items.isEmpty())
{
// Information: with this code, expands ONLY first level in QTreeView
view->setExpanded(Items.first(), true);
}
}
}
Run Code Online (Sandbox Code Playgroud)
当settings.ini文件包含:
[MainWindow] …Run Code Online (Sandbox Code Playgroud) 我想在QML中使用QAbstractListModel派生模型.将模型绑定到视图已经很有效.
我想要实现的下一件事是能够访问特定项目及其角色,就像使用QML ListModel一样
grid.model.get(index).DisplayRole
Run Code Online (Sandbox Code Playgroud)
但是我不知道如何在我的QAbstractListModel派生模型中实现这个get方法.
任何提示?
我想用 QCombobox 作为该Combobox的Swing在Java.所以我需要 Model用来握住我的物体.我如何在QCombobox中保存我的对象.(我认为我应该在模型中保存数据,因为它QCombobox是根据MVC模式设计的......)任何帮助都将受到赞赏.
我有一个QTableView,可以动态加载来自继承QAbstractItemModel的自定义模型的数据.该模型实现了fetchMore和canFetchMore.
问题是我希望能够为小数据集选择所有行,但如果我在视图中点击ctrl-a,它只会选择当前加载的行.
是否有某种机制强制QTableView获取更多行?理想情况下,我想显示一个进度条,指示从模型加载的数据部分.每隔几秒钟我就想强制模型加载更多的数据,但我仍然希望让用户与目前已加载的数据进行交互.这样,当进度条完成时,用户可以按ctrl-a并确信所有数据都已被选中.
编辑:我有另一个激励用例.我想跳转到特定的行,但如果没有加载该行,我的界面什么都不做.
如何强制QAbstractItemModel获取更多(或特定行),然后强制QTableView显示它?
如果我没有实现fetchMore和canFetchMore,之前的功能可以正常工作,但加载表格非常慢.当我实现这些方法时,情况正好相反.没有这个问题的答案导致我的qt界面的可用性问题,所以我正在为这个问题打开奖金.
这是我用来选择特定行的方法.
def select_row_from_id(view, _id, scroll=False, collapse=True):
"""
_id is from the iders function (i.e. an ibeis rowid)
selects the row in that view if it exists
"""
with ut.Timer('[api_item_view] select_row_from_id(id=%r, scroll=%r, collapse=%r)' %
(_id, scroll, collapse)):
qtindex, row = view.get_row_and_qtindex_from_id(_id)
if row is not None:
if isinstance(view, QtWidgets.QTreeView):
if collapse:
view.collapseAll()
select_model = view.selectionModel()
select_flag = QtCore.QItemSelectionModel.ClearAndSelect
#select_flag = QtCore.QItemSelectionModel.Select
#select_flag = QtCore.QItemSelectionModel.NoUpdate
with ut.Timer('[api_item_view] selecting name. qtindex=%r' % (qtindex,)):
select_model.select(qtindex, select_flag)
with ut.Timer('[api_item_view] …Run Code Online (Sandbox Code Playgroud) 我有QTreeWidget几个列,我添加QTreeWidgetItems它.我尝试让第二列包含每个数值,Item以便我可以按此值对项目进行排序
QTreeWidgetItem has a method called setData(int column, int role, QVariant(data))
Run Code Online (Sandbox Code Playgroud)
我找不到关于这个role论点是什么的任何文档.我所知道的是,如果我将其设置为1或2,列中会显示某些内容,如果我将其设置为0或> = 3,则列中不显示任何内容,无论数字总是按字母顺序排序,这是错的.
我使用PyQt使用QAbstractItemModel管理树视图.到目前为止,我已成功实现它,以便我可以加载数据,展开和折叠它,以及编辑值.
然而,我无法做的一件事是围绕插入和移除行.
我想做的简短版本:
当用户编辑特定单元格时,我需要实际删除对象层次结构中的基础项目并将其替换为另一个项目.我在我的模型的setData方法中实现它.因为我不完全理解我在做什么,所以我似乎已经将它设置为段错误.
基本上,我只需要更好地理解数据模型如何与QModelIndex交互,但阅读和重新阅读文档似乎并没有启发我.任何帮助(或指向一个体面的教程的任何链接 - 最好,但不一定,在python中 - 也将非常感激).
以下是我正在使用的代码示例:
#---------------------------------------------------------------------------
def setData(self, index, value, role=QtCore.Qt.EditRole):
"""
Sets the data.
"""
if index.isValid() and (0 <= index.row() < self.rowCount()):
item = index.internalPointer()
value = value.toString()
if index.column() == 5:
# rip out the current object and replace it with a new one of
# the correct datatype.
#next 4 lines get info from my underlying hierarchy of objects
dataType = str(value)
parent = item.get_parent()
name = item.get_name()
row = parent.get_row_of_child(name) …Run Code Online (Sandbox Code Playgroud) 我需要在QtreeView中显示自己的数据模型的工作示例(c ++).
我正在尝试创建一个QTreeView并使用自定义模型.我把qDebug()报表在不同的地方,我已经确定,data()是永远不会被调用.我该如何解决这个问题?
该模型的代码如下
#include "ModelItemNeural.h"
ModelItemNeural::ModelItemNeural(QObject *parent, NeuralNode *rootNode)
: QAbstractItemModel(parent)
{
this->rootNode = 0;
}
QModelIndex ModelItemNeural::index(int row, int column, const QModelIndex &parent) const
{
// Out of bounds and null rootNode check.
if (rootNode == 0 || row < 0 || column < 0)
{
return QModelIndex();
}
NeuralNode* parentNode = nodeFromIndex(parent);
NeuralNode* childNode = parentNode->getInputs().value(row);
if (childNode == 0)
{
return QModelIndex();
}
return createIndex(row, column, childNode);
}
QModelIndex ModelItemNeural::parent(const QModelIndex &child) …Run Code Online (Sandbox Code Playgroud) 我正在使用一个QListView源自的自定义模型QAbstractItemModel.我有数百万件物品.我打电话listView->setUniformItemSizes(true)来阻止在向模型添加项目时调用一堆布局逻辑.到目前为止,一切都按预期工作.
问题是使用键盘导航列表很慢.如果我在列表中选择一个项目,然后按向上/向下,选择将快速移动,直到选择需要滚动列表.然后变得非常迟钝.按向上翻页或向下翻页也非常滞后.问题似乎是当使用键盘选择项目(也就是"当前项目")时,列表也会向上/向下滚动.
如果我使用鼠标,导航列表很快.我可以使用快速的鼠标滚轮.我可以按照我想要的速度向上/向下拖动滚动条 - 从列表顶部到底部 - 列表视图快速更新.
关于为什么改变选择和滚动列表的组合如此缓慢的任何想法?有可行的解决方案吗?
为了更好地说明问题,我在此更新中提供了放大信息.
这主要是性能问题,尽管它确实与用户体验(UX)有关.看看当我使用键盘滚动浏览时会发生什么QListView:
注意底部附近的减速?这是我的问题的焦点.让我解释一下我如何浏览列表.
说明:
我希望列表能够像键盘的打字速度一样快地滚动 - 换句话说,选择下一个项目所花费的时间不应该在滚动列表时减慢.
这是我使用鼠标时的样子:
说明:
这证明了两个要点:
模型不是问题.如您所见,该模型在性能方面没有任何问题.它可以比显示元素更快地传递元素.
选择和滚动时性能会降低.选择和滚动的"完美风暴"(如使用键盘在列表中导航所示)导致减速.因此,我推测,在滚动期间正常执行的选择时,Qt以某种方式进行了大量处理.
我想指出,我的问题似乎与Qt有关.
在使用不同的框架之前,我已经实现了这种类型的东西.我想做的是在模型 - 视图理论的范围内.我可以使用带有juce :: ListBox的juce :: ListBoxModel以极快的速度完成我所描述的内容.这是愚蠢的快速(此外,当每个项目已经具有唯一索引时,不需要为每个项目创建重复索引,例如a ).我认为Qt需要针对其模型 - 视图架构的每个项目,虽然我不喜欢开销成本,但我认为我理性,我可以忍受它.无论哪种方式,我都不怀疑这些因素导致我的表现减慢.QModelIndexQModelIndexQModelIndex
通过JUCE实现,我甚至可以使用向上翻页和向下翻页键来导航列表,它只是在列表中闪现.使用Qt QListView实现,即使使用发布版本,它也会突然出现并且很迟钝.
在我的项目中,我需要使用 QML 列表视图来显示一些数据的列表。而且,我使用的 QT 版本是 QT 5.0.2。由于在这个版本的 Qt 中没有滚动条视图,我设法按照这个例子来实现它。
现在,数据源是另一个组件,它提供了 C++ API 来请求数据范围。并且数据集中的元素数量可能很大(以数万计)。
我已按照以下步骤实现我的要求:
到目前为止,还不错。但我需要澄清几点——
我在谷歌上花了很多时间来回答我的问题,但我成功地失败了。:(
任何帮助表示赞赏。提前致谢。