当前位置: 首页 > news >正文

Python----PyQt开发(PyQt高级:手搓一个文件浏览器)

一、效果展示

二、界面设计 

该界面通过Qt Designer设计

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'file_web.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(565, 459)self.verticalLayoutWidget = QtWidgets.QWidget(Form)self.verticalLayoutWidget.setGeometry(QtCore.QRect(10, 10, 551, 441))self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)self.verticalLayout.setContentsMargins(0, 0, 0, 0)self.verticalLayout.setObjectName("verticalLayout")self.horizontalLayout = QtWidgets.QHBoxLayout()self.horizontalLayout.setObjectName("horizontalLayout")self.back_btn = QtWidgets.QPushButton(self.verticalLayoutWidget)self.back_btn.setMinimumSize(QtCore.QSize(40, 40))font = QtGui.QFont()font.setPointSize(15)self.back_btn.setFont(font)self.back_btn.setObjectName("back_btn")self.horizontalLayout.addWidget(self.back_btn)self.lineEdit = QtWidgets.QLineEdit(self.verticalLayoutWidget)font = QtGui.QFont()font.setPointSize(15)self.lineEdit.setFont(font)self.lineEdit.setObjectName("lineEdit")self.horizontalLayout.addWidget(self.lineEdit)self.verticalLayout.addLayout(self.horizontalLayout)self.listWidget = QtWidgets.QListWidget(self.verticalLayoutWidget)self.listWidget.setObjectName("listWidget")self.verticalLayout.addWidget(self.listWidget)self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "文件浏览器"))self.back_btn.setText(_translate("Form", "返回"))

三、 信号与槽连接

3.1、得到当前的目录路径

def show_dir(self):# 显示当前目录内容的函数self.listWidget.clear()  # 清空列表self.dir.setPath(self.lineEdit.text())  # 设置QDir对象的路径为文本框中的路径Dir_filter = QDir.AllEntries | QDir.NoDotAndDotDot  # 过滤条件:所有条目,不包括.和..sort_filter = QDir.DirsFirst  # 排序条件:文件夹优先self.list_list = self.dir.entryInfoList(Dir_filter, sort_filter)  # 获取目录列表for i in self.list_list:  # 遍历目录列表item = QListWidgetItem()  # 创建新的列表项# 根据条目类型设置图标if i.isDir():item.setIcon(QIcon('../菜单/images/icon/dir.png'))  # 设置目录图标elif i.isFile():item.setIcon(QIcon('../菜单/images/icon/file.png'))  # 设置文件图标item.setText(i.fileName())  # 设置列表项的文本为文件或目录名self.listWidget.addItem(item)  # 将项添加到列表中

3.2、 选择目录中的选项双击

def btn_btn(self, item):# 双击列表项的槽函数result = self.dir.cd(item.text())  # 进入选中的目录print(result)  # 打印进入结果if result:  # 如果成功进入目录path = self.dir.absolutePath()  # 获取当前目录的绝对路径self.lineEdit.setText(path)  # 更新路径文本框self.show_dir()  # 更新目录展示else:  # 如果不是目录,尝试打开文件filepath = self.dir.absolutePath() + '/' + item.text()  # 构造文件路径# print(filepath)self.progess = QProcess(self)  # 创建QProcess对象用于启动子进程argv = []  # 存储进程的参数argv.append("notepad.py")  # 添加要执行的脚本argv.append(filepath)  # 添加文件路径作为参数self.progess.start('python', argv)  # 启动python进程

3.3、 返回上层目录

def back_slot(self):# 返回上层目录的槽函数result = self.dir.cdUp()  # 尝试进入上层目录if result:  # 如果成功path = self.dir.absolutePath()  # 获取当前目录的绝对路径print(path)  # 打印路径self.lineEdit.setText(path)  # 更新文本框中的路径self.show_dir()  # 更新目录展示

四、用到的库函数 

QDir      

        setPath()        设置路径

        entryInfoList() 获取当前目录下所有文件夹以及文件信息,返回一个列表

        cd()        切换目录

        cdUp()        返回上一级目录

        absolutePath()        获取当前目录的绝对路径

QListWidget

        addItem()        添加单元项

        clear()        清空列表

        itemDoubleClicked()        单元项双击信号

QListWidgetItem

        setText()        设置文本

        setIcon()        设置图标

        text()        获取文本内容

QFileInfoList

        at()        访问元素

QFileInfo

        fileName()        获取文件名

        isDir()        判断是不是文件夹

        isFile()        判断是不是文件

QProcess

        start()        启动进程

五、完整代码

import sys
from PyQt5.QtGui import QIcon
from file_web import Ui_Form  # 导入生成的UI类
from PyQt5.QtWidgets import QApplication, QWidget, QListWidget, QListWidgetItem  # 导入所需的Qt组件
from PyQt5.QtCore import QDir, QProcess  # 导入目录和进程相关的类class fileWidge(QWidget, Ui_Form):def __init__(self):super().__init__()self.setupUi(self)  # 设置UI界面self.lineEdit.setText('./')  # 设置初始路径为当前目录self.dir = QDir()  # 创建QDir对象以处理目录self.show_dir()  # 显示当前目录的内容self.slot_init()  # 初始化信号和槽连接def slot_init(self):# 连接按钮和列表项的信号到相应的槽函数self.back_btn.clicked.connect(self.back_slot)  # 返回上级目录按钮self.listWidget.itemDoubleClicked.connect(self.btn_btn)  # 双击列表项打开def back_slot(self):# 返回上层目录的槽函数result = self.dir.cdUp()  # 尝试进入上层目录if result:  # 如果成功path = self.dir.absolutePath()  # 获取当前目录的绝对路径print(path)  # 打印路径self.lineEdit.setText(path)  # 更新文本框中的路径self.show_dir()  # 更新目录展示def btn_btn(self, item):# 双击列表项的槽函数result = self.dir.cd(item.text())  # 进入选中的目录print(result)  # 打印进入结果if result:  # 如果成功进入目录path = self.dir.absolutePath()  # 获取当前目录的绝对路径self.lineEdit.setText(path)  # 更新路径文本框self.show_dir()  # 更新目录展示else:  # 如果不是目录,尝试打开文件filepath = self.dir.absolutePath() + '/' + item.text()  # 构造文件路径# print(filepath)self.progess = QProcess(self)  # 创建QProcess对象用于启动子进程argv = []  # 存储进程的参数argv.append("notepad.py")  # 添加要执行的脚本argv.append(filepath)  # 添加文件路径作为参数self.progess.start('python', argv)  # 启动python进程def show_dir(self):# 显示当前目录内容的函数self.listWidget.clear()  # 清空列表self.dir.setPath(self.lineEdit.text())  # 设置QDir对象的路径为文本框中的路径Dir_filter = QDir.AllEntries | QDir.NoDotAndDotDot  # 过滤条件:所有条目,不包括.和..sort_filter = QDir.DirsFirst  # 排序条件:文件夹优先self.list_list = self.dir.entryInfoList(Dir_filter, sort_filter)  # 获取目录列表for i in self.list_list:  # 遍历目录列表item = QListWidgetItem()  # 创建新的列表项# 根据条目类型设置图标if i.isDir():item.setIcon(QIcon('../菜单/images/icon/dir.png'))  # 设置目录图标elif i.isFile():item.setIcon(QIcon('../菜单/images/icon/file.png'))  # 设置文件图标item.setText(i.fileName())  # 设置列表项的文本为文件或目录名self.listWidget.addItem(item)  # 将项添加到列表中if __name__ == '__main__':app = QApplication(sys.argv)  # 创建应用程序实例windows = fileWidge()  # 创建主窗口实例windows.show()  # 显示主窗口sys.exit(app.exec_())  # 运行应用程序并在退出时关闭

http://www.mrgr.cn/news/90684.html

相关文章:

  • 十四、GitLab 流水线自动化部署之 Windows Server
  • NPDP学习笔记 -产品经理(第二版)-第三章 产品创新流程
  • arduino扩展:Arduino Mega 控制 32 个舵机(参考表情机器人)
  • @JsonRawValue 注解
  • 后端程序如何应对流量激增
  • Ubuntu20.04上搭建nginx正向代理提供上网服务
  • Druid GetConnectionTimeoutException解决方案之一
  • vue-model如何自定义指令,及批量注册自定义指令
  • 【GRPO】GRPO原理原文翻译
  • docker学习---第3步:docker实操大模型
  • Hive增量迁移方案与实操PB级
  • Linux初始化 配置yum源
  • 大数据学习之PB级百战出行网约车二
  • poi 将图片写入到excel文件中
  • vue开发06:前端通过webpack配置代理处理跨域问题
  • NumPy中生成和堆叠数组、生成切片的特殊对象:np.r_ np.c_ np.s_
  • 欧盟《人工智能法案》
  • SolidWorks C# How
  • 大模型WebUI:Gradio全解12——使用Agents和Tools智能代理工具构建UI(1)
  • 系统URL整合系列【不改hosts文件版】-- 代码1(springcloud-gateway动态路由)
  • 教程 | Proxmox VE(PVE)安装全流程指南(末尾附镜像及快速配置脚本)
  • 250213-异常exception
  • 【鸿蒙】ArkUI-X跨平台问题集锦
  • Elasticvue使用总结
  • Navicat导入海量Excel数据到数据库(简易介绍)
  • Linux——stdio