单个文件打开 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_())