如何从TreeView打开文件内容并显示在MDI子窗口中
解决方案
关键修改说明
- 移除
os.startfile(file_name)调用,改为读取文件内容并创建文本编辑控件用于显示 - 增加文件类型判断与异常处理,避免因点击文件夹、无读取权限等情况导致程序崩溃
- 为MDI子窗口设置对应文件名作为标题,提升辨识度
修改后的完整代码
from PyQt5 import QtWidgets from PyQt5 import QtGui from PyQt5 import QtCore from PyQt5.QtWidgets import QMdiArea, QMdiSubWindow, QTextEdit, QMessageBox from PyQt5.Qt import QMenu import os import tree2 class fileview(tree2.Ui_FOSApplication, QtWidgets.QMainWindow): count = 0 def __init__(self): super(fileview, self).__init__() self.setupUi(self) self.treeView.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.treeView.customContextMenuRequested.connect(self.context_view) self.populate() def populate(self): # 使用原始字符串避免路径转义问题 path = r'C:\FOS Application' self.model = QtWidgets.QFileSystemModel() self.model.setRootPath(QtCore.QDir.rootPath()) self.treeView.setModel(self.model) self.treeView.setRootIndex(self.model.index(path)) self.treeView.setColumnHidden(1, True) self.treeView.setColumnHidden(2, True) self.treeView.setColumnHidden(3, True) def context_view(self): view = QtWidgets.QMenu() open_action = view.addAction("Open") open_action.triggered.connect(self.subwindow) curser = QtGui.QCursor() view.exec_(curser.pos()) def subwindow(self): fileview.count = fileview.count + 1 content_widget, file_name = self.openfile() if content_widget: self.sub = QMdiSubWindow() self.sub.setWidget(content_widget) # 设置子窗口标题为文件名 self.sub.setWindowTitle(os.path.basename(file_name)) self.mdiArea.addSubWindow(self.sub) self.sub.show() def openfile(self): index = self.treeView.currentIndex() file_name = self.model.filePath(index) # 先判断选中的是否是文件 if not os.path.isfile(file_name): QMessageBox.warning(self, "提示", "请选择一个文件") return None, file_name try: # 读取文件内容,编码可根据实际文件调整 with open(file_name, 'r', encoding='utf-8') as f: content = f.read() # 创建文本编辑控件显示内容 text_edit = QTextEdit() text_edit.setPlainText(content) # 可选:设置为只读模式,防止误修改 text_edit.setReadOnly(True) return text_edit, file_name except Exception as e: QMessageBox.warning(self, "读取错误", f"无法读取文件:{str(e)}") return None, file_name if __name__ == '__main__': app = QtWidgets.QApplication([]) fb = fileview() fb.show() app.exec_()
细节补充
- 路径处理:将原路径字符串改为原始字符串
r'C:\FOS Application',避免转义字符引发的路径识别错误 - 错误提示:针对非文件选择、读取失败等场景添加弹窗提示,提升用户体验
- 编码兼容:默认使用utf-8编码读取文件,若需支持其他编码(如gbk),可修改
open函数的encoding参数
内容的提问来源于stack exchange,提问作者Venkat
相关产品推荐
相关产品推荐

