(PyQt) QTreeView - 想要展开/折叠所有子级和孙级

2023-12-26

我希望能够展开或折叠 QTreeView 中特定分支的所有子级。我正在使用 PyQt4。

我知道 QTreeView 有一个绑定到 * 的展开所有子项功能,但我需要两件事:它需要绑定到不同的组合键(shift-space),我还需要能够折叠所有子项。

这是我到目前为止所尝试过的: 我有一个 QTreeView 的子类,其中我正在检查 Shift-Space 键组合。我知道 QModelIndex 会让我使用“child”函数选择一个特定的子项,但这需要知道子项的数量。我am能够通过查看内部指针来获取子级的计数,但这只为我提供了层次结构第一级的信息。如果我尝试使用递归,我可以获得一堆子计数,但随后我不知道如何将它们转换回有效的 QModelIndex。

这是一些代码:

def keyPressEvent(self, event):
    """
    Capture key press events to handle:
    - enable/disable
    """
    #shift - space means toggle expanded/collapsed for all children
    if (event.key() == QtCore.Qt.Key_Space and 
        event.modifiers() & QtCore.Qt.ShiftModifier):
        expanded = self.isExpanded(self.selectedIndexes()[0])
        for cellIndex in self.selectedIndexes():
            if cellIndex.column() == 0: #only need to call it once per row
                #I can get the actual object represented here
                item = cellIndex.internalPointer()
                #and I can get the number of children from that
                numChildren = item.get_child_count()
                #but now what? How do I convert this number into valid
                #QModelIndex objects? I know I could use: 
                #   cellIndex.child(row, 0)
                #to get the immediate children's QModelIndex's, but how
                #would I deal with grandchildren, great grandchildren, etc...
                self.setExpanded(cellIndex, not(expanded))
        return

这是我正在研究的递归方法的开始,但是当实际尝试设置扩展状态时我陷入困境,因为一旦进入递归,我就失去了与任何有效 QModelIndex 的“联系”......

def toggle_expanded(self, item, expand):
    """
    Toggles the children of item (recursively)
    """
    for row in range(0,item.get_child_count()):
        newItem = item.get_child_at_row(row)
        self.toggle_expanded(newItem, expand)
    #well... I'm stuck here because I'd like to toggle the expanded
    #setting of the "current" item, but I don't know how to convert
    #my pointer to the object represented in the tree view back into
    #a valid QModelIndex
    #self.setExpanded(?????, expand)   #<- What I'd like to run
    print "Setting", item.get_name(), "to", str(expand) #<- simple debug statement that indicates that the concept is valid

感谢大家花时间查看此内容!


好吧……兄弟姐妹实际上并没有带我去我想去的地方。我设法让代码按如下方式工作(这似乎是一个不错的实现)。仍然要感谢 Ebral 教授,他让我沿着兄弟姐妹的想法走上了正确的道路(事实证明我需要使用 QModelIndex.child(row, column) 并从那里递归迭代)。

请注意,代码中有以下假设:它假设您的基础数据存储对象能够报告它们有多少个子对象(在我的代码中为 get_child_count() )。如果不是这种情况,您将不得不以不同的方式获得子计数...也许只是任意尝试获取子索引 - 使用 QModelIndex.child(row, col) - 行数不断增加直到您返回无效索引? - 这是 Ebral 教授的建议,我可能仍然会尝试(只是我已经有了一种简单的方法来通过从我的数据存储请求来获取子计数)。

另请注意,我实际上根据是展开还是折叠在递归中的不同点展开/折叠每个节点。这是因为,通过反复试验,我发现如果我只在代码中的一处执行动画树视图,动画树视图就会卡顿和弹出。现在,通过根据我是否位于顶层(即我正在影响的分支的根 - 而不是整个树视图的根)来反转我执行此操作的顺序,我得到了一个非常流畅的动画。下面记录了这一点。

以下代码位于 QTreeView 子类中。

#---------------------------------------------------------------------------
def keyPressEvent(self, event):

    if (event.key() == QtCore.Qt.Key_Space and self.currentIndex().column() == 0):
        shift = event.modifiers() & QtCore.Qt.ShiftModifier
        if shift:
            self.expand_all(self.currentIndex())
        else:                
            expand = not(self.isExpanded(self.currentIndex()))
            self.setExpanded(self.currentIndex(), expand)


#---------------------------------------------------------------------------
def expand_all(self, index):
    """
    Expands/collapses all the children and grandchildren etc. of index.
    """
    expand = not(self.isExpanded(index))
    if not expand: #if collapsing, do that first (wonky animation otherwise)
        self.setExpanded(index, expand)    
    childCount = index.internalPointer().get_child_count()
    self.recursive_expand(index, childCount, expand)
    if expand: #if expanding, do that last (wonky animation otherwise)
        self.setExpanded(index, expand)


#---------------------------------------------------------------------------
def recursive_expand(self, index, childCount, expand):
    """
    Recursively expands/collpases all the children of index.
    """
    for childNo in range(0, childCount):
        childIndex = index.child(childNo, 0)
        if expand: #if expanding, do that first (wonky animation otherwise)
            self.setExpanded(childIndex, expand)
        subChildCount = childIndex.internalPointer().get_child_count()
        if subChildCount > 0:
            self.recursive_expand(childIndex, subChildCount, expand)
        if not expand: #if collapsing, do it last (wonky animation otherwise)
            self.setExpanded(childIndex, expand)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(PyQt) QTreeView - 想要展开/折叠所有子级和孙级 的相关文章

  • 如何重写(重新实现)QFileSystemModel 中的成员函数

    我已经为此苦苦挣扎了一段时间 Qt s QFileSystemModel由于图标获取算法非常糟糕 在获取数百个文件时速度非常慢 我想完全禁用图标 它们被提取到QFileSystemModel data方法不是虚拟的 QFileSystemM
  • MSVC C4100:“应用程序”:未引用的形式参数警告

    使用 MSVC 编译时 以下代码会生成 C4100 警告 这怎么可能 显然引用了 应用程序 class ApplicationInfo public QObject Q OBJECT public static void initializ
  • 从辅助线程重定向标准输出(使用函数而不是类进行多线程?)

    我正在努力让我的stdout显示在QTextEdit通过 Qt Designer PyQt5 制作 实际上我让它工作了 但它并没有在制作的同时显示信息 相反 它会等待进程完全结束 然后才会立即显示所有信息 我知道这应该通过线程来解决 也自Q
  • qt 如何知道按钮被点击?

    我正在尝试编写一个程序 用声音进行一些操作 我的问题是我有 3 个播放按钮和 3 个标签 我希望无论我单击 播放 按钮 都应该播放按钮附近标签中名称的声音 我有一个没有任何参数的播放插槽 那么 如何分别连接到每个播放按钮和每个标签呢 实际上
  • 如何使用bind将成员函数作为函数指针传递?

    我试图将成员函数作为函数指针传递 这样我就不需要依赖单例或全局函数来处理 Qt 5 中的 Qt 消息 据我所知 我的 std function 是正确的类型 它具有正确的签名 并且绑定应该允许我插入隐式this指针 本质上是将成员函数传递为
  • MapItemView 在 dataChanged 信号后不会更新

    我正在使用 QMLMapItemView使用 C 的组件QAbstractListModel基于模型 这MapItemView当模型重置时 或者每当添加新项目或删除现有项目时 工作正常 但是 那MapItemView不反映对已添加项目的更改
  • 在 QML 中控制纹理 3D 对象的不透明度

    我对 QML 中的 Qt 3D 有点陌生 我正在尝试控制 Qt 3D 的不透明度textured3D 对象 我正在使用简单qml3d https github com tripolskypetr simpleqml3d测试项目来做到这一点
  • Qt - QProcess 不工作

    我尝试启动 Internet Explorer 所以我使用下面的代码 QProcess process new QProcess this QString temp C Program Files Internet Explorer iex
  • 仅当从 Qt 连接时网页返回 HTTP 406 错误

    我有一个测试页面设置http mlecturedownload com test qt php http mlecturedownload com test qt php有以下代码
  • Qmake 不支持源目录下的构建目录

    我创建了一个可以在 OS X 上编译和运行的应用程序 我现在想开始让它在 Windows 上运行 首先 我将项目复制到 Windows 机器上并尝试编译 但收到此错误 警告 Qmake不支持源目录下的构建目录 有任何想法吗 将影子构建目录设
  • 如何在Qt中更快地读取数据?

    Qt读取数据库比C 慢吗 我想我错过了一些东西 为了比较阅读速度 我在 Qt 中编写了以下内容 QElapsedTimer t t start int count 0 QString cs Driver SQL Server Server
  • 在 Qt 中创建/写入新文件

    我正在尝试写入文件 如果该文件不存在 则创建它 我在互联网上搜索过 但没有任何效果 我的代码目前看起来像这样 QString filename Data txt QFile file filename if file open QIODev
  • 如何阻止 Qt Creator 将可执行文件放置在“调试”子目录中?

    我正在 Qt Creator 中构建一个项目 虽然我不关心中间 obj 文件去哪里 但重要的是最终的可执行文件应放入 并运行 许多依赖项 DLL 等所在的特定目录中 被发现 因此 在 Qt Creator 中 我选择 Shadow Buil
  • 如何从 ffmpeg 中打开的文件获取流信息?

    我正在尝试使用 ffmpeg 读取视频文件 我有与其旧版本相对应的工作代码 并开始尝试升级到最新的构建版本 将所有这些已弃用的函数替换为其实际的类似函数 但是我遇到了问题 似乎没有检索到任何流 并且视频负载停止在轨道中 这是我正在使用的代码
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • QListWidget 拖放项目从 Symbian 列表中消失

    我在实现带有可通过拖放重新排序的自定义项的 QListWidget 时遇到问题 问题是当我在某个项目上快速双击 非常短的拖放 时 该项目有时会从 QListWidget 中消失 这是我的小部件的构造函数 ListPopisiDragDrop
  • Qt - 等待 Qprocess 完成

    我正在使用 CMDQProcess但我有一个问题 My code QProcess process process start cmd exe process write del f b txt n r process waitForFin
  • QStandardItemModel::removeRows() 在我的用例中不起作用

    基本上我想删除模型中的所有行 我更喜欢使用removeRows 代替clear 因为我想保留我的标题 我想我错过了一些东西 文档在这里 http doc qt nokia com 4 7 snapshot qstandarditemmode
  • 如何在 PySide/PyQt 中制作一个位于屏幕中央的小部件?

    这段代码有效 但我想知道是否有更简单的方法 def center self qr self frameGeometry cp gui QDesktopWidget availableGeometry center qr moveCenter
  • 右键单击 QPushButton 上的 contextMenu

    对于我的应用程序 我在 Qt Designer 中创建了一个 GUI 并将其转换为 python 2 6 代码 关于一些QPushButton 与设计器创建 我想添加右键单击上下文菜单 菜单选项取决于应用程序状态 如何实现这样的上下文菜单

随机推荐

  • Python:从文件夹中读取多个json文件

    我想知道如何阅读几本json来自单个文件夹的文件 不指定文件名 只是它们是 json 文件 此外 还可以将它们变成pandas数据框 你能给我一个基本的例子吗 一种选择是列出目录中的所有文件操作系统列表目录 https docs pytho
  • .dockerignore 无法包含具有 !**/*.extension 模式的子目录中的文件

    我遇到了问题 dockerignore文件 这是我的项目结构 file sh file js file go file py subdir file2 go file2 py dockerignore Dockerfile 根据 docke
  • c# 将DataGridView保存到Xml文件

    这是我保存文件的按钮 private void metroButton12 Click object sender EventArgs e save DataSet ds DataSet dataGridView1 DataSource S
  • 使用 resharper 从大型类创建接口

    我有一个非常大的类 有很多方法 是否可以使用 Resharper 从该类构建接口 Yes 我的快捷键是 Ctrl Shift R 来调出重构选项 对类名执行此操作允许您 提取接口 或者 您可以从菜单 gt ReSharper gt Refa
  • 在哪里放置对象映射(在 RestKIt 中)

    因为我不想劫持另一个线程 所以我提出了关于映射的问题 首先阅读 RestKit 中放置对象映射的最佳位置是哪里 https stackoverflow com questions 7190721 wheres the best place
  • 如何在启用 Markdown 的 Slack 附件行的开头显示大于号?

    我正在尝试匹配 Slack API 消息的模型 该消息在附件文本行开头的链接中具有大于 gt 字符 该模型还在附件文本中使用斜体和粗体 所以我有text in the mrkdown in大批 不幸的是 这会导致 Slack 解释为 gt
  • 访问 RFC 调用系统的堆栈内存

    当程序在 SAP ECC 中运行时 系统堆栈 存储所有全局变量 无论在该单个会话中调用什么模块 程序 当它调用支持 RFC 的功能模块 FM 时 会在被调用系统中创建一个新的系统堆栈 并且当被调用 FM 完成时 只能在 ECC 中检索被调用
  • InvalidCharacterError 仅在 IE 中出现

    我们有一个订单表单 它使用 ziplookup 功能 当在字段中输入邮政编码时 城市 县 州和邮政编码也会输入到同一字段中 tr td class formLabel Zip Code td td class formColon nbsp
  • SwiftUI 和 NavigationView 的动画错误可能是什么原因造成的?

    我一直在尝试一些 SwiftUI 布局 我想尝试的事情之一是创建一个简单的圆形进度环 在对代码进行了一段时间的研究之后 我设法让一切都按照我希望的方式工作 至少对于原型来说是这样 当我将此视图嵌入到 SwiftUI NavigationVi
  • 将 python 日期格式 (%Y) 转换为 java (yyyy)

    我有很多时间格式 格式如下 Y m d H M S 有没有快速的方法或库将它们转换为 YYYY MM DD HH MM SS 我当前的方法是使用字符串替换 但也许我会错过一些边缘情况 我可能的格式化程序是 d b Y y H M S p f
  • Node.JS deflate/gzip 响应文本

    我看到了所示的示例here http nodejs org api zlib html zlib examples response writeHead 200 content encoding deflate raw pipe zlib
  • 在可能保存模型时处理 ember-data 中的自定义服务器端错误

    保存模型时是否有正确的方法来处理自定义错误 举个例子 假设我有一个只有两个属性 名称 和 值 的模型 当我这样做时 var myModel this get store createRecord myModel name someName
  • IE9 中 的边框半径错误

    看见那个 div 元素正确渲染边框 边框半径 但任何 a or a div
  • 如何使用 JavaScript 获取滚动条位置?

    我正在尝试使用 JavaScript 检测浏览器滚动条的位置 以确定当前视图在页面中的位置 我的猜测是 我必须检测拇指在轨道上的位置 然后检测拇指的高度占轨道总高度的百分比 我是否过于复杂化了 或者 JavaScript 是否提供了比这更简
  • 当在 contenteditable 按钮中输入空格时,Chrome 会触发 onClick

    我有一个按钮contenteditable true 我可以很好地编辑文本 但无法在 Chrome 中输入空格 当我按下空格键时 Chrome 会在按钮上触发 onClick 事件 然而 Safari 会按照您的预期插入一个空格 使用此代码
  • C++ 的类似 Hibernate 的层

    在 C 中使用 DB 确实是一团糟 当我转向 Java 并能够使用统一的系统将整个层抽象出来 又名 Hibernate 时 这真是令人耳目一新 有几个用于 DB 的 C 抽象层 但它们通常是特定于供应商的 并且只有一个薄层包装了真正的 C
  • 我想单击列表视图中的任意位置(空白区域)

    作为一名新的 Android 程序员 我必须运行我的待办事项应用程序 对于圣诞节购物来说这是可以接受的 但我真的很想让整个列表项行可单击 现在我必须点击文本 物品越短越难击中 我的主要活动扩展了 ListActivity 我将 Resour
  • rspec 测试中 Rails 应用程序的端口号

    我想使用 rspec 结合 Faraday 和 Faraday middleware 来测试 Rails 应用程序的 json 响应 要使用 Faraday 需要应用程序 URL 在测试中我想使用本地主机 端口号 问题是 如何在 rspec
  • 如何在编辑 XML 文件时运行我的项目?

    当我编辑 XML 文件并尝试运行 Android 项目 通过单击工具栏中的 播放 按钮或 command shift F11 时 没有任何反应 我必须切换到我也在编辑的 java 文件才能运行该项目 我怎样才能解决这个问题 您无法运行 xm
  • (PyQt) QTreeView - 想要展开/折叠所有子级和孙级

    我希望能够展开或折叠 QTreeView 中特定分支的所有子级 我正在使用 PyQt4 我知道 QTreeView 有一个绑定到 的展开所有子项功能 但我需要两件事 它需要绑定到不同的组合键 shift space 我还需要能够折叠所有子项