PyQt5 文件对话框应用

单个文件打开 QFileDialog.getOpenFileName()
多个文件打开 QFileDialog.getOpenFileNames()
文件夹选取 QFileDialog.getExistingDirectory()
文件保存 QFileDialog.getSaveFileName()
  • 打开多个文件 

PyQt5中的打开文件对话框,选择文件后返回的是文件的文件路径而不是打开文件,只是习惯上说打开文件,实际上只是获取到文件的路径,多文件打开使用QFileDialog.getOpenFileNames(),将会返回一个文件路径列表和文件类型,本例用QListView来显示文件路径,由于QStringListModel()可以直接与列表对应,可以将返回的文件路径列表直接不经过处理设置成QStringListModel(),然后显示在QListView中。

import sys
from PyQt5.QtCore import QStringListModel
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, QHBoxLayout, QWidget, QListView, QFileDialog
from PyQt5.QtGui import QIcon

class menubarDemo(QMainWindow):
    def __init__(self):
        super().__init__()
        self.initUI()
        self.setWindowTitle('文件对话框应用')
        self.setGeometry(300, 300, 450, 450)
        self.show()

    def initUI(self):
        self.statusBar()  # 创建一个状态栏
        self.menubar = self.menuBar()
        self.menubar.setNativeMenuBar(False)
        self.fileMenu = self.menubar.addMenu('File')
        self.listView = QListView()
        self.slm = QStringListModel()
        self.widget = QWidget()
        self.widget.setStyleSheet("QWidget{border: 1px solid #00ff00;}")#设置widget的样式,这里选用了大家最喜爱的绿色边框
        self.widget.setContentsMargins(0, 0, 0, 0)
        self.hbox = QHBoxLayout()
        self.hbox.addWidget(self.listView)
        self.widget.setLayout(self.hbox)
        self.setCentralWidget(self.widget)
        # file菜单功能
        fileAction = QAction(QIcon('file.png'), '打开文件', self)  # QIcon是设置图标,随便找一个.png图片放项目目录下并命名为file.png
        fileAction.setShortcut('Ctrl+F')  # 设置快捷键
        fileAction.setStatusTip('打开文件')  # 当鼠标放到fileAction上时显示的提示信息(左下角)
        fileAction.triggered.connect(self.openFile)  # 点击fileAction后要触发的操作,这里链接到openFile函数
        # 将这个Action添加到fileMenu上
        self.fileMenu.addAction(fileAction)
    '''打开文件,返回一个文件路径列表'''
    def openFile(self):
        '''返回文件路径列表self.files和文件类型filetype'''
        self.files, filetype = QFileDialog.getOpenFileNames(self,
                                                  "多文件选择",
                                                  "./",
                                                  "All Files (*);;Text Files (*.txt)")
        print(self.files)
        self.slm.setStringList(self.files)
        self.listView.setModel(self.slm)
        self.listView.clicked.connect(self.clickedFunc)#单击触发槽函数

    def clickedFunc(self, qModelIndex):
        for i in range(len(self.files)):
            if self.files[qModelIndex.row()] == self.files[i]:
                print('item{} '.format(i)+ self.files[i])

if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = menubarDemo()
    sys.exit(app.exec_())

效果:

  • 打开单个文件

QFileDialog.getOpenFileNames()打开多个文件,也可以选择一个文件从而打开单个文件,但是其返回的是一个路径列表,这一点要清楚,而 QFileDialog.getOpenFileName()打开单个文件,其返回的是一个文件路径的字符串.

import sys
from PyQt5.QtCore import QStringListModel
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, QHBoxLayout, QWidget, QListView, QFileDialog
from PyQt5.QtGui import QIcon


class menubarDemo(QMainWindow):
    files = [] #创建一个空列表用来存放文件路径,用来设置QStringListModel
    def __init__(self):
        super().__init__()
        self.initUI()
        self.setWindowTitle('文件对话框应用')
        self.setGeometry(300, 300, 450, 450)
        self.show()

    def initUI(self):
        self.statusBar()  # 创建一个状态栏
        self.menubar = self.menuBar()
        self.menubar.setNativeMenuBar(False)
        self.fileMenu = self.menubar.addMenu('File')
        self.listView = QListView()
        self.slm = QStringListModel()
        self.widget = QWidget()
        self.widget.setStyleSheet("QWidget{border: 1px solid #00ff00;}")  # 设置widget的样式,这里选用了大家最喜爱的绿色边框
        self.widget.setContentsMargins(0, 0, 0, 0)
        self.hbox = QHBoxLayout()
        self.hbox.addWidget(self.listView)
        self.widget.setLayout(self.hbox)
        self.setCentralWidget(self.widget)
        # file菜单功能
        fileAction = QAction(QIcon('file.png'), '打开文件', self)  # QIcon是设置图标,随便找一个.png图片放项目目录下并命名为file.png
        fileAction.setShortcut('Ctrl+F')  # 设置快捷键
        fileAction.setStatusTip('打开文件')  # 当鼠标放到fileAction上时显示的提示信息(左下角)
        fileAction.triggered.connect(self.openFile)  # 点击fileAction后要触发的操作,这里链接到openFile函数
        # 将这个Action添加到fileMenu上
        self.fileMenu.addAction(fileAction)
    '''打开文件,返回一个文件路径和文件类型'''
    def openFile(self):
        self.file, filetype = QFileDialog.getOpenFileName(self,
                                                      "单文件选择",
                                                      "./",
                                                      "All Files (*);;Text Files (*.txt)")
        print(self.file) #输出的是一个文件路径字符串
        print(filetype) #输出的是文件类型(自定的过滤文件类型"All Files (*);;Text Files (*.txt)")中的其中一个,看你打开文件时选择那个过滤是all files还是text files)
        self.files.append(self.file)
        self.slm.setStringList(self.files) #将self.files列表传入数据模型中
        self.listView.setModel(self.slm) #设置listView模型
        self.listView.clicked.connect(self.clickedFunc)  # 单击触发槽函数

    def clickedFunc(self, qModelIndex):
        for i in range(len(self.files)):
            if self.files[qModelIndex.row()] == self.files[i]:
                print('item{} '.format(i) + self.files[i])


if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = menubarDemo()
    sys.exit(app.exec_())
  • 打开文件夹

编写一个passfile函数过滤掉子目录,实现打开多文件的功能 

import sys, os
from PyQt5.QtCore import QStringListModel
from PyQt5.QtWidgets import QMainWindow, QApplication, QAction, QHBoxLayout, QWidget, QListView, QFileDialog
from PyQt5.QtGui import QIcon


class menubarDemo(QMainWindow):
    files = []  # 创建一个空列表用来存放文件路径,用来设置QStringListModel
    def __init__(self, parent=None):
        super(menubarDemo, self).__init__(parent=parent)
        self.initUI()
        self.setWindowTitle('文件对话框应用')
        self.setGeometry(300, 300, 450, 450)
        self.show()

    def initUI(self):
        self.statusBar()  # 创建一个状态栏
        self.menubar = self.menuBar()
        self.menubar.setNativeMenuBar(False)
        self.fileMenu = self.menubar.addMenu('File')
        self.listView = QListView()
        self.slm = QStringListModel()
        self.widget = QWidget()
        self.widget.setStyleSheet("QWidget{border: 1px solid #00ff00;}")  # 设置widget的样式,这里选用了大家最喜爱的绿色边框
        self.widget.setContentsMargins(0, 0, 0, 0)
        self.hbox = QHBoxLayout()
        self.hbox.addWidget(self.listView)
        self.widget.setLayout(self.hbox)
        self.setCentralWidget(self.widget)
        # file菜单功能
        fileAction = QAction(QIcon('file.png'), '打开文件', self)  # QIcon是设置图标,随便找一个.png图片放项目目录下并命名为file.png
        fileAction.setShortcut('Ctrl+F')  # 设置快捷键
        fileAction.setStatusTip('打开文件')  # 当鼠标放到fileAction上时显示的提示信息(左下角)
        fileAction.triggered.connect(self.openFile)  # 点击fileAction后要触发的操作,这里链接到openFile函数
        # 将这个Action添加到fileMenu上
        self.fileMenu.addAction(fileAction)

    '''打开文件夹,返回一个文件夹路径'''
    def openFile(self):
        self.dir = QFileDialog.getExistingDirectory(self, "文件夹选择", "/home/ly") #返回文件夹路径
        print(self.dir)
        self.files = passfile.passdir(self.dir)
        print(self.files)
        self.slm.setStringList(self.files)  # 将self.files列表传入数据模型中
        self.listView.setModel(self.slm)  # 设置listView模型
        self.listView.clicked.connect(self.clickedFunc)  # 单击触发槽函数

    def clickedFunc(self, qModelIndex):
        for i in range(len(self.files)):
            if self.files[qModelIndex.row()] == self.files[i]:
                print('item{} '.format(i) + self.files[i])
class passfile():
    @classmethod
    def passdir(self, path):
        subList = os.listdir(path)
        files = []
        for i in subList:
            if not os.path.isdir(os.path.join(path,i)):
                files.append(i)
        return files

if __name__ == '__main__':
    app = QApplication(sys.argv)
    example = menubarDemo()
    sys.exit(app.exec_())

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值