探索文件与交互:使用PyQt5构建一个高级文件选择器

在当今的应用程序开发中,文件管理和交互是一个重要的组成部分。特别是对于桌面应用程序,提供一个直观、功能丰富的文件选择器是提高用户体验的关键。

本篇博客,我将介绍如何使用Python和PyQt5来构建一个高级的文件选择器,它不仅能浏览文件,还能预览图片,编辑文本文件,并提供基本的右键菜单操作。

关键功能

  • 文件浏览:使用QColumnViewQFileSystemModel展示文件系统。
  • 图片预览:选中图片文件时,能在界面中预览。
  • 文本编辑:选中文本文件时,能在界面中进行编辑。
  • 保存编辑内容:编辑文本文件后,提供保存功能。
  • 右键菜单:提供自定义的右键菜单,实现文件的打开和查看所在文件夹。

设计思路

使用PyQt5的强大功能,我们可以轻松创建出复杂的用户界面。首先,我们使用QColumnView来展示文件系统的层级结构,它能提供直观的列式浏览体验。接着,通过QFileSystemModel来管理和展示文件系统中的数据。

图片预览和文本编辑功能是通过判断文件类型来实现的。如果选中的是图片文件(如jpg、png等),程序会在一个QLabel中显示该图片。如果选中的是文本文件(如txt、py等),则可以在QTextEdit中编辑,并通过一个保存按钮将更改保存回文件。

右键菜单是通过setContextMenuPolicycustomContextMenuRequested信号实现的。当用户在文件上点击右键时,会弹出一个自定义菜单,提供打开文件或文件所在文件夹的选项。

代码实现

以下是完整的代码实现: 

import sys
import os
from PyQt5.QtWidgets import QApplication, QMainWindow, QColumnView, QFileSystemModel, QLabel, QTextEdit, QPushButton, \QVBoxLayout,QHBoxLayout, QWidget, QMenu
from PyQt5.QtGui import QPixmap, QDesktopServices
from PyQt5.QtCore import QDir, QFileInfo, QUrl, Qt
from PyQt5.Qt import QSplitterclass FileExplorer(QMainWindow):def __init__(self):super().__init__()self.setWindowTitle("文件选择器")self.setGeometry(100, 100, 1000, 600)self.model = QFileSystemModel()self.model.setRootPath(QDir.rootPath())self.columnView = QColumnView()self.columnView.setModel(self.model)self.columnView.clicked.connect(self.on_file_selected)self.columnView.setContextMenuPolicy(Qt.CustomContextMenu)self.columnView.customContextMenuRequested.connect(self.open_context_menu)self.imageLabel = QLabel("图片预览")self.imageLabel.setScaledContents(True)self.textEdit = QTextEdit()self.saveButton = QPushButton("保存")self.saveButton.clicked.connect(self.save_file)rightLayout = QVBoxLayout()rightLayout.addWidget(self.imageLabel)rightLayout.addWidget(self.textEdit)rightLayout.addWidget(self.saveButton)self.rightWidget = QWidget()self.rightWidget.setLayout(rightLayout)splitter = QSplitter(Qt.Vertical)splitter.addWidget(self.columnView)splitter.addWidget(self.rightWidget)splitter.setStretchFactor(1, 1)centralWidget = QWidget()centralWidget.setLayout(QVBoxLayout())centralWidget.layout().addWidget(splitter)self.setCentralWidget(centralWidget)def on_file_selected(self, index):path = self.model.filePath(index)fileInfo = QFileInfo(path)if fileInfo.isFile():if fileInfo.suffix().lower() in ['png', 'jpg', 'jpeg', 'bmp', 'gif']:self.show_image_preview(path)elif fileInfo.suffix().lower() in ['txt', 'py', 'html', 'css', 'js', 'cs']:self.show_text_editor(path)else:self.clear_previews()def show_image_preview(self, path):self.textEdit.hide()self.saveButton.hide()self.imageLabel.setPixmap(QPixmap(path))self.imageLabel.show()def show_text_editor(self, path):self.imageLabel.hide()self.textEdit.setPlainText("")self.textEdit.show()self.saveButton.show()with open(path, 'r', encoding="utf-8") as file:self.textEdit.setText(file.read())self.currentTextFilePath = pathdef save_file(self):with open(self.currentTextFilePath, 'w', encoding='utf-8') as file:file.write(self.textEdit.toPlainText())def clear_previews(self):self.imageLabel.clear()self.textEdit.clear()self.imageLabel.hide()self.textEdit.hide()self.saveButton.hide()def open_context_menu(self, position):index = self.columnView.indexAt(position)if not index.isValid():returnmenu = QMenu()openAction = menu.addAction("打开")openFolderAction = menu.addAction("打开所在文件夹")action = menu.exec_(self.columnView.mapToGlobal(position))if action == openAction:self.open_file(index)elif action == openFolderAction:self.open_file_folder(index)def open_file(self, index):path = self.model.filePath(index)QDesktopServices.openUrl(QUrl.fromLocalFile(path))def open_file_folder(self, index):path = self.model.filePath(index)QDesktopServices.openUrl(QUrl.fromLocalFile(os.path.dirname(path)))if __name__ == '__main__':app = QApplication(sys.argv)ex = FileExplorer()ex.show()sys.exit(app.exec_())

结语

这个文件选择器是一个展示PyQt5框架能力的小示例。通过这个项目,你可以学习到如何处理文件系统数据,实现基本的文件操作界面,以及如何根据不同的文件类型提供不同的功能。PyQt5为桌面应用开发提供了广泛的可能性,你可以在此基础上继续扩展功能,打造更加强大的应用程序。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/244637.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java中的this和super

①this 在Java中,this关键字代表当前对象的引用。它可以用于以下几个方面: 引用当前对象的成员变量:使用this关键字可以引用当前对象的成员变量,以区分成员变量和方法参数或局部变量之间的命名冲突。例如,如果一个方法…

java进阶-jvm精讲及实战

深入了解jvm及实战 1.引言2.jvm概念理解1.1什么是jvm1.2 jvm功能1.3 jvm规范及主流版本1.4 jre jdk jvm的区别和联系1.5 jvm组成 2.jvm-字节码文件class2.1 java和class无关性2.2 字节码应用场景2.4 字节码文件打开方式2.3 字节码文件组成2.3.1 一般信息2.3.2 常量池2.3.3 方法…

Vulnhub-dc4

靶场下载 https://download.vulnhub.com/dc/DC-4.zip 信息收集 判断目标靶机的存活地址: # nmap -sT --min-rate 10000 -p- 192.168.1.91 -oN port.nmap Starting Nmap 7.94 ( https://nmap.org ) at 2024-01-21 16:36 CST Stats: 0:00:03 elapsed; 0 hosts completed (1 up…

68. redis计数与限流中incr+expire的坑以及解决办法(Lua+TTL)

文章目录 一、简介二、代码演进第一版代码(存在bug隐患)第二版代码(几乎无隐患)第三版代码(完美无瑕) 一、简介 在日常工作中,经常会遇到对某种操作进行频次控制或者统计次数的需求,此时常用的…

快速上手的AI工具-文心一言绘画达人

前言 大家好,现在AI技术的发展,它已经渗透到我们生活的各个层面。对于普通人来说,理解并有效利用AI技术不仅能增强个人竞争力,还能在日常生活中带来便利。无论是提高工作效率,还是优化日常任务,AI工具都可…

蓝桥杯---三羊献瑞

观察下面的加法算式: 其中,相同的汉字代表相同的数字,不同的汉字代表不同的数字。 请你填写“三羊献瑞”所代表的4位数字(答案唯一),不要填写任何多余内容。 答案 代码 public class _03三羊献瑞 {public static void main(String[] args) {//c 生 b 瑞 g 献 d 辉…

Excel学习

例子可在文件-新建-模板中找到。 *快速填充 ctrl-e,需要将内容融入一个表格内,插入-表格,然后关掉数据-筛选,就可以填充了。 ctrl-D,选中单元格,然后快捷键向下填充。 *快速分析 ctrl-q,开…

c++:类和对象(5),运算符重载

目录 运算符重载概念&#xff1a; 运算符重载 1.成员函数重载号 2.全局函数重载号 打印结果&#xff1a; <<运算符重载 递增运算符重载 简单例子 输出结果为&#xff1a; 赋值运算符重载 如何重载 输出结果为&#xff1a; 什么时候重载 关系运算符重载 简单例…

【LeetCode: 36. 有效的数独 + 模拟】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

Qt 多次绘图

使用Qt 的时候发现&#xff1a; 背景&#xff1a;自己定义一个类&#xff0c;把它和某个ui文件绑定。(类似 Qt creator 默认创建的工程&#xff09;问题&#xff1a;当鼠标在窗口内单击的时候会触发2次绘图。&#xff1f;难道不应该是一次吗&#xff1f; 于是开始了如下的测试…

设备通过GB28181注册到EasyCVR,平台看不到设备信息的排查方法汇总

智慧安防平台EasyCVR能在复杂的网络环境中&#xff08;专网、局域网、广域网、VPN、公网等&#xff09;将前端海量的设备进行统一集中接入与视频汇聚管理&#xff0c;平台支持设备通过4G、5G、WIFI、有线等方式进行视频流的接入与传输&#xff0c;支持的接入协议包括&#xff1…

【立创EDA-PCB设计基础完结】7.DRC设计规则检查+优化与丝印调整+打样与PCB生产进度跟踪

前言&#xff1a;本文为PCB设计基础的最后一讲&#xff0c;在本专栏中【立创EDA-PCB设计基础】前面已经将所有网络布线铺铜好了&#xff0c;接下来进行DRC设计规则检查优化与丝印调整打样与PCB生产进度跟踪 目录 1.DRC设计规则检查 2.优化与丝印调整 1.过孔连接优化 2.泪滴…

C# .NET读取Excel文件并将数据导出到DataTable、数据库及文本

Excel文件是存储表格数据的普遍格式&#xff0c;因此能够高效地读取和提取信息对于我们来说至关重要。C#语言借助.NET Framework和各种库的广泛功能&#xff0c;能够进行高效的数据操作。利用C#读取Excel文件并将数据写入数据库和DataTable&#xff0c;或者将数据用于其他目的&…

大数据开发之SparkSQL

第 1 章&#xff1a;spark sql概述 1.1 什么是spark sql 1、spark sql是spark用于结构化数据处理的spark模块 1&#xff09;半结构化数据&#xff08;日志数据&#xff09; 2&#xff09;结构化数据&#xff08;数据库数据&#xff09; 1.2 为什么要有sparksql hive on s…

Eyes Wide Shut? Exploring the Visual Shortcomings of Multimodal LLMs

大开眼界&#xff1f;探索多模态模型种视觉编码器的缺陷。 论文中指出&#xff0c;上面这些VQA问题&#xff0c;人类可以瞬间给出正确的答案&#xff0c;但是多模态给出的结果却是错误的。是哪个环节出了问题呢&#xff1f;视觉编码器的问题&#xff1f;大语言模型出现了幻觉&…

计算机网络基础概念解释

​ 1. 什么是网络 随着时代的发展&#xff0c;越来越需要计算机之间互相通信&#xff0c;共享软件和数据&#xff0c;即以多个计算机协同⼯作来完成业务&#xff0c;于是有了网络互连。 网络互连&#xff1a;将多台计算机连接在⼀起&#xff0c;完成数据共享。 数据共享本质是…

GPT科研应用与AI绘图及论文高效写作

详情点击链接&#xff1a;GPT科研应用与AI绘图及论文高效写作 一OpenAI 1.最新大模型GPT-4 Turbo 2.最新发布的高级数据分析&#xff0c;AI画图&#xff0c;图像识别&#xff0c;文档API 3.GPT Store 4.从0到1创建自己的GPT应用 5. 模型Gemini以及大模型Claude2二定制自己…

论文阅读笔记AI篇 —— Transformer模型理论+实战 (三)

论文阅读笔记AI篇 —— Transformer模型理论实战 &#xff08;三&#xff09; 第三遍阅读&#xff08;精读&#xff09;3.1 Attention和Self-Attention的区别&#xff1f;3.2 Transformer是如何进行堆叠的&#xff1f;3.3 如何理解Positional Encoding&#xff1f;3.x 文章涉及…

常用电子器件学习——MOS管

MOS管介绍 MOS&#xff0c;是MOSFET的缩写。MOSFET 金属-氧化物半导体场效应晶体管&#xff0c;简称金氧半场效晶体管&#xff08;Metal-Oxide-Semiconductor Field-Effect Transistor, MOSFET&#xff09;。 一般是金属(metal)—氧化物(oxide)—半导体(semiconductor)场效应晶…

【Unity学习笔记】Unity TestRunner使用

转载请注明出处&#xff1a;&#x1f517;https://blog.csdn.net/weixin_44013533/article/details/135733479 作者&#xff1a;CSDN|Ringleader| 参考&#xff1a; Input testingGetting started with Unity Test FrameworkHowToRunUnityUnitTest如果对Unity的newInputSystem感…