【问题标题】:QTreeWidget fill from thread Item expandedQTreeWidget 从线程项填充扩展
【发布时间】:2026-01-06 02:30:01
【问题描述】:

我从一个线程中填充了我的 QTreeWidget。到目前为止效果很好,但是在填充数据后,所有项目都没有展开,但它们都是可用的。我添加的所有项目我都设置了...setExpanded(true);

这最终导致了问题,treeCount() 为 1。

我想避免在构造函数expandAll 中设置,并且我也想避免制作一个额外的列表来计算项目。

如果我从普通应用程序线程启动填充方法作为一个简单的函数,我...setExpanded(true); 的所有内容在填充后都会展开。

我有什么技巧可以避免这个问题?

【问题讨论】:

标签: c++ qt


【解决方案1】:

永远不要使用来自不同线程的 QObject。所有 GUI 对象操作都需要在同一个线程中完成。

在线程之间使用信号/槽机制来传达新项目。或者,在额外线程中设置一个新的 Q*ItemModel 并在信号中传递一次。

【讨论】:

  • 我认为 TreeWidget 上的“数据”操作是对其模型的操作,而不是对其样式的操作。如果我创造。线程中的模型并通过发射到树小部件来签署这个模型,这不一样吗?
  • TreeWidget 通过直接函数调用访问模型。模型必须与小部件驻留在同一线程中。当您将新模型传递给另一个线程时,您可以相应地使用 moveToThread()。