QTreeView实时刷新界面

有的时候我们QTreeView的里面数据已经改变,但是界面却还是显示原来的数据,有的人会说用update函数,但是这个函数没啥用,

经过半天的摸索,发现了这三种方法。

第一种:使用QTreeView的

doItemsLayout()

但是这个函数最好是在主线程中调用,因为这个函数里面是哟你定时器,在非主线程中调用会报警告。

第二种:使用模型/视图框架,继承QAbstractItemModel,然后就可以使用下面两个函数来刷新。

    beginResetModel();
    endResetModel();

第三种:下面这个方法是最好的

QAbstractItemView::viewport()->update();

 

  • 10
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
刷新 QTreeView 上的列表,可以使用以下步骤: 1. 获取到 QTreeView 的模型对象,通常是通过 `QTreeView.model()` 方法获取。 2. 对模型进行修改,添加、删除或更新数据。 3. 调用 `QTreeView.update()` 方法,或者使用 `QModelIndex` 对象的 `model().dataChanged()` 方法来通知视图数据变化。 4. 如果需要重新绘制整个视图,可以调用 `QTreeView.repaint()` 方法。 下面是一个示例代码,演示如何刷新 QTreeView 上的列表: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QTreeView, QVBoxLayout, QWidget from PyQt5.QtCore import QAbstractItemModel, QModelIndex class TreeModel(QAbstractItemModel): def __init__(self, data, parent=None): super().__init__(parent) self.rootItem = TreeItem("Root") self.setupModelData(data, self.rootItem) def setupModelData(self, data, parent): for itemData in data: parent.addChild(TreeItem(itemData, parent)) def index(self, row, column, parent=QModelIndex()): if not self.hasIndex(row, column, parent): return QModelIndex() if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() childItem = parentItem.child(row) if childItem: return self.createIndex(row, column, childItem) else: return QModelIndex() def parent(self, index): if not index.isValid(): return QModelIndex() childItem = index.internalPointer() parentItem = childItem.parent() if parentItem == self.rootItem: return QModelIndex() return self.createIndex(parentItem.row(), 0, parentItem) def rowCount(self, parent=QModelIndex()): if parent.column() > 0: return 0 if not parent.isValid(): parentItem = self.rootItem else: parentItem = parent.internalPointer() return parentItem.childCount() def columnCount(self, parent=QModelIndex()): if parent.isValid(): return parent.internalPointer().columnCount() else: return self.rootItem.columnCount() def data(self, index, role=Qt.DisplayRole): if not index.isValid(): return None if role != Qt.DisplayRole: return None item = index.internalPointer() return item.data(index.column()) class TreeItem: def __init__(self, data, parent=None): self.parentItem = parent self.itemData = data self.childItems = [] def addChild(self, item): self.childItems.append(item) def child(self, row): if row < 0 or row >= len(self.childItems): return None return self.childItems[row] def childCount(self): return len(self.childItems) def columnCount(self): return len(self.itemData) def data(self, column): if column < 0 or column >= len(self.itemData): return None return self.itemData[column] def parent(self): return self.parentItem class MainWindow(QMainWindow): def __init__(self): super().__init__() self.treeView = QTreeView() layout = QVBoxLayout() layout.addWidget(self.treeView) widget = QWidget() widget.setLayout(layout) self.setCentralWidget(widget) # 创建一个模型并设置给 QTreeView data = ['Apple', 'Banana', 'Cherry'] self.model = TreeModel(data) self.treeView.setModel(self.model) # 添加一个按钮,点击时刷新列表 button = QPushButton("Refresh") layout.addWidget(button) button.clicked.connect(self.refreshTreeView) def refreshTreeView(self): # 修改模型数据 data = ['Apple', 'Banana', 'Cherry', 'Durian'] self.model.setupModelData(data, self.model.rootItem) # 通知视图数据变化 self.model.dataChanged.emit(QModelIndex(), QModelIndex()) if __name__ == "__main__": app = QApplication([]) mainWindow = MainWindow() mainWindow.show() app.exec_() ``` 在上面的示例中,我们创建了一个自定义的 `TreeModel` 类来表示树形结构的数据。然后,在 `MainWindow` 类中创建了一个 QTreeView,并将自定义的模型对象设置给它。在 `refreshTreeView` 方法中,我们修改了模型的数据,并调用了 `dataChanged` 信号来通知视图数据发生变化。点击 "Refresh" 按钮时,会刷新 QTreeView 上的列表。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值