You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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_()

细节补充

  1. 路径处理:将原路径字符串改为原始字符串r'C:\FOS Application',避免转义字符引发的路径识别错误
  2. 错误提示:针对非文件选择、读取失败等场景添加弹窗提示,提升用户体验
  3. 编码兼容:默认使用utf-8编码读取文件,若需支持其他编码(如gbk),可修改open函数的encoding参数

内容的提问来源于stack exchange,提问作者Venkat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 16:18:34