问题标签 [qabstractitemview]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
169 浏览

qt - 发出没有角色的 dataChanged() 时,QAbstractItemView 如何知道我的自定义角色?

收到信号 QAbstractItemModel::dataChanged() 后,连接的 QAbstractItemViews 将调用 QAbstractItemModel::data() 方法来更新其数据。用户定义的 data() 方法应该根据预定义角色(如 Qt::DisplayRole)和任何数量的用户定义的自定义角色(其值应等于 Qt::UserRole 及以上)提供不同的信息。

考虑到这一点,关于 QAbstractItemModel::dataChanged() 信号的 Qt 文档说明了这一点:

可选角色参数可用于指定实际修改了哪些数据角色。角色参数中的空向量意味着所有角色都应被视为已修改。角色参数中元素的顺序没有任何相关性。

http://doc.qt.io/qt-5/qabstractitemmodel.html#dataChanged

鉴于此,当我使用空的角色向量调用 dataChanged 时,QAbstractItemView 如何知道调用我的所有自定义角色?还是这仅指预定义的 Qt 角色?

0 投票
0 回答
548 浏览

qt - 折叠的 QTreeWidget 的最小垂直尺寸太大

我有一个 QScrollArea,其中有许多 QTreeWidgets 排列成 QVBoxLayout。每个树小部件都有一个顶级项目(但子项目的层次结构是任意的)。单个树小部件的垂直滚动条通过 禁用setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff)。我希望树小部件的垂直大小在它们的项目展开或折叠时动态改变,所以我setSizeAdjustPolicy(QAbstractScrollArea::AdjustToContents)为每个 QTreeWidgets 设置了。垂直大小策略设置为最小,并且在所有树小部件下方都有一个垂直间隔。布局间距设置为 0。现在,它像预期的那样工作,除了一件事:当树小部件完全折叠时,它仍然占用太多垂直空间,如图所示。我只是不知道如何摆脱这个额外的空间,以便树小部件在折叠时彼此相邻。

在此处输入图像描述.

Qt Designer中生成的ui-form的内容:

来自 ui-form 的相关翻译代码:

0 投票
1 回答
811 浏览

qt - Qt:将项目插入我的模型以提示视图重新检查 canFetchMore 时会发出什么?

我有一个自定义模型(扩展QAbstractTableModel),其中行数据被务实地添加。出于性能原因,我使用获取功能 ( canFetchMore, fetchMore) 来避免当项目不可见时 UI 滞后。

插入新行时,我不想触发QAbstractItemModel::rowsInserted. 但如果这些行在视图中可见,我希望它们自动出现。如果用户与视图交互,它们会出现,例如选择最后一个项目(视图调用“canFetchMore”并且fetchMore仅当这些项目可见时才会调用)。

我如何向视图发出信号,表明有更多行可供显示,但需要获取?

0 投票
0 回答
508 浏览

python - QTableView - 如何处理大量 dataChanged 信号?

我必须编写一个表格视图,它应该能够处理数以万计的包含图像的单元格(每个单元格的图像都不同)。全部在 python 中使用 PySide2。

我使用线程池实现了图像的加载。问题是我必须异步通知视图已经为给定索引加载了图像,以便它可以重新加载显示。使用dataChanged 信号有效,但要处理的信号太多,并且 UI 不会显示,直到线程池处理完所有索引。

我在下面提供了一个重现问题的工作示例(无图像,仅文本)。现在,我通过让线程稍微休眠来解决这个问题(只是取消注释 Work.run 方法中的 time.sleep(1) 行),但这对我来说更像是一种肮脏的黑客攻击,而不是真正的解决方案。

我想到了以下解决方案:

  • 尝试使 dataChanged 信号异步运行。我怀疑 dataChanged 和将视图更新为 AutoConnection 的任何插槽之间的默认连接。有没有办法做到这一点?
  • 将修改后的索引收集在缓冲区中,并定期更新视图。我想避免这种解决方案,因为在两次评估缓冲区之间找到一个好的时间间隔是一项艰巨的任务。

您对如何避免这种阻塞行为有任何其他想法吗?

感谢您的意见!

0 投票
1 回答
1116 浏览

qt - qt 在视图中永久显示委托

您如何使用QStyledItemDelegate/QItemDelegate永久显示复杂的小部件,即处理Qt.DisplayRole,而不仅仅是Qt.EditRole

文档没有使用paint() ......但这只是复杂的方式!让我们以渲染单元格内部QTreeViewQTableVeiw内部为例QTableView

QAbstractItemView.setIndexWidget(),但这是一个坏主意,因为它仅用于显示静态内容(静态模型有什么乐趣?)。

笔记

我在另一个帖子中找到了部分答案,但这只是答案的一小部分,所以我认为有必要发布一个带有适当问题的新帖子。

0 投票
2 回答
255 浏览

c++ - 如何超链接到 QAbstractItemModel 中的项目?

使用的 Qt 版本:4.7.1 和 4.8

我将分层数据存储为从 QAbstractItemModel 派生的模型中的节点。我的应用程序 GUI 中有一个QTreeView用于显示分层数据。(分层数据对于这个问题可能不是必需的;我遇到的一般问题适用于任何模型和视图中的任何类型的数据。)

我的应用程序 GUI 中有一个显示超链接的文本框(一个QPlainTextEdit小部件,但这不是必需的)。当用户点击超链接时,我可以拦截它并获取超链接的 URL。到目前为止,一切都很好。

当我截获该超链接时,我将QTreeView导航到特定节点,根据需要扩展其父节点,以便用户可以看到它。

超链接的 URL 将采用让我知道正在请求节点的格式,并将包含有关该特定节点的识别信息。例如:

所以,问题是:什么东西可以识别特定节点,并且可以编码为文本字符串?

我一直在阅读关于QPersistentModelIndex. 这听起来像是一个合理的开始。在我格式化超链接的时候,我肯定会知道QModelIndex特定节点的,并且可以从中构造一个QPersistentModelIndex。但是我迷失了如何将其转换为字符串,然后再将字符串转换回一个QModelIndex我可以从中推断出特定节点的字符串。

任何建议表示赞赏。

0 投票
1 回答
852 浏览

python - 带有浏览按钮的自定义项目委托的 QTreeView

使用 Qt5 框架(通过 Python 的 pyQt5),我需要创建一个带有参数 - 值列的 QTreeView 小部件,其中某些行的值项必须具有内部“浏览”按钮以打开文件浏览对话框并放置选定的文件到相应值的字段中。

阅读关于项目委托的 Qt 手册,我整理了以下代码:

自定义 BrowseEdit 类(QLineEdit + Browse 操作)

QTreeView 的自定义项目委托:

创建底层模型:

为可浏览的编辑字段设置项目委托:

当我通过按下编辑器中的浏览按钮调用打开文件对话框并在选择文件后尝试关闭对话框时发生错误。那时,会引发一个异常,说 BrowseEdit 对象已被删除!

我意识到发生这种情况是因为项目委托在退出编辑模式(在启动文件浏览对话框时发生)时释放了底层编辑器小部件(在我的情况下为 BrowseEdit)。但是我怎样才能避免这种情况呢?

我尝试过的另一件事是使用QAbstractItemView::setItemDelegateForRow方法,如下所示:

-- 但是这段代码会导致未知的异常导致应用程序崩溃而没有任何回溯消息。

0 投票
0 回答
47 浏览

c++ - 使用 QTreeView(或 QAbstractItemView)在项目激活时打开对话框,或单击编辑项目

我正在尝试在我的程序中创建类似于 Windows 文件资源管理器的行为,在我的项目中双击(或在选择并聚焦时按键盘上的 Enter 键)QAbstractItemView将在新窗口中“打开”该项目,并且单击该项目(当它已被选中时)将允许用户使用一个小的就地文本字段重命名该项目。

不幸的是,我试图让它工作的各种尝试要么导致双击发生,要么根本只有一个或另一个工作。

这是我迄今为止最好的尝试:

我也尝试过覆盖void QAbstractItemView::edit(const QModelIndex& index, QAbstractItemView::EditTrigger trigger, QEvent* event),但使用它QAbstractItemView::DoubleClickedtrigger参数中过滤似乎并没有太大的作用:(

0 投票
0 回答
18 浏览

qt5 - 为什么 QAbstractItemModel 控制“可选择”标志

QAbstractItemModel 包含一个“标志”方法,用户可以覆盖该方法以帮助识别哪些项目是可选的。

但是,似乎(至少在 QQC2 中)从 ItemSelectionModel 添加/删除项目完全在用户代码的控制之下(手动)。例如,在 TreeView (QQC2) 中,用户代码使用 TreeView 委托中的鼠标区域将项目添加到选择模型。

那么为什么 QAbstractItemModel 控制“可选”标志呢?不应该在视图中控制吗?(由于不同的视图可能对可选择的内容有不同的规则)

我对可选择标志的用途以及 ItemSelectionModel 如何与视图交互感到困惑

0 投票
1 回答
61 浏览

c++ - Qt:尝试将拖放添加到可编辑树模型示例不起作用

我正在尝试学习如何在 Qt 中实现拖放到模型/视图设置。作为练习,我尝试对Qt 网站上提供的可编辑树模型示例执行此操作:

可编辑树模型

为了通过拖放扩展它,我按照 Qt 文档中关于“使用拖放查看项目”中的说明进行操作,更具体地说是“使用模型/视图类”

我将尝试的代码放在GitHub 存储库中。主要修改如下,但还有其他重要修改;这是根据文档的完整更改。

然而,这并不完全奏效。虽然我可以拖放项目,但复制的项目显示为空白。这可以在此屏幕截图中看到,但主要屏幕截图是:

拖动

结果为空白项

请注意,文档描述了重新实现拖放功能的需要,而我没有QAbstractItemModeldropMimeData这是因为,在检查该类的源代码时,我发现它的默认实现应该已经在拖放复制项目中起作用,因为它使用默认的 application/x-qabstractitemmodeldatalistMIME 格式并用于setItemData插入的项目。

这里有什么问题?是默认dropMimeData不起作用还是其他原因?