在 PyQt5 中清除 QTableView

Clearing QTableView in PyQt5

我正在使用 PyQt5,我正在尝试通过按下按钮来清除 QTreeView。该程序应该使用 QLineEdit 从用户那里获取路径,然后将其显示在 TreeView 上。到目前为止,它工作得很好。问题是我不知道如何在我完成后清除视图,或者如果我输入了错误的路径。我知道我可以只使用 clear() 函数,但它只能用于 Widget,不能用于 View。如果我使用 reset() 函数,它只会显示“This PC”文件夹,而不会完全清除树。 我将包含代码以防万一。

from PyQt5 import QtWidgets as qtw
import sys


class MainWindow(qtw.QWidget):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        # Init UI
        self.tree = qtw.QTreeView()
        self.model = qtw.QFileSystemModel()

        # Items
        self.path_input = qtw.QLineEdit()
        path_label = qtw.QLabel("Enter a path to begin: ")
        check_btn = qtw.QPushButton("Check")  # To display the items
        clear_btn = qtw.QPushButton("Clear")  # To clear the TreeView
        start_btn = qtw.QPushButton("Start")  # Not implemented yet

        # Layouts
        top_h_layout = qtw.QHBoxLayout()
        top_h_layout.addWidget(path_label)
        top_h_layout.addWidget(self.path_input)
        top_h_layout.addWidget(check_btn)
        bot_h_layout = qtw.QHBoxLayout()
        bot_h_layout.addWidget(clear_btn)
        bot_h_layout.addWidget(start_btn)
        main_v_layout = qtw.QVBoxLayout()
        main_v_layout.addLayout(top_h_layout)
        main_v_layout.addWidget(self.tree)
        main_v_layout.addLayout(bot_h_layout)
        self.setLayout(main_v_layout)

        check_btn.clicked.connect(self.init_model)
        clear_btn.clicked.connect(self.clear_model)

        self.show()

    def init_model(self):
        self.model.setRootPath(self.path_input.text())
        self.tree.setModel(self.model)
        self.tree.setRootIndex(self.model.index(self.path_input.text()))

    def clear_model(self):
        self.tree.reset()  # This is where I get the problem


if __name__ == "__main__":
    app = qtw.QApplication(sys.argv)
    w = MainWindow()
    sys.exit(app.exec_())

您不能“清除视图”,因为视图仅显示模型的内容,不能直接修改(或“清除”)它。此外,reset() 不会执行您想要实现的目标:

void QAbstractItemView::reset()

Reset the internal state of the view.

状态,不是模型。如您所见,在您的情况下,它只会重置处于折叠状态的根节点。

您需要清除的是模型,但由于您显然无法清除文件系统模型,因此解决方案是将视图的状态设置为开始搜索之前的状态:通过从视图中删除模型。

    def clear_model(self):
        self.tree.setModel(None)