在 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)
我正在使用 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)