俗话说实践是学习最有效的方法。最近在学习python,于是就参考着各类文章,也倒腾了一个简易图片浏览器,效果图如下:
整个浏览器分为左右两侧,左侧是地址栏+图片文件列表;右侧则是图片显示区域。
左侧地址栏有四个控件构成,分别是QLineEdit,QPushButton,QListWidget和隐藏的QTreeView。初始化会在QLineEdit显示当前地址,点击右侧按钮,则会展示隐藏的目录树(如下图):
选中目录后,QlineEdit则会自动更新选中目录的路径地址,而其下方的QlistWidget则显示带预览icon的图片文件。如下是实现上述功能的代码:
def showtree(self):
# 显示/隐藏treeView
if self.treeView.isVisible():
self.treeView.setVisible(False)
else:
self.treeView.setVisible(True)
def treeview_init(self):
# 初始化树形目录
# 获取系统所有文件
# 进行筛选只显示文件夹,不显示文件和特色文件
if os.path.exists(self.lineEdit.text()):
path = self.lineEdit.text()
else:
path = os.path.abspath(os.path.dirname(__file__))
model01.setFilter(QtCore.QDir.Dirs | QtCore.QDir.NoDotAndDotDot)
model01.setRootPath(path)
# 定义创建文件树
self.treeView.setModel(model01)
for col in range(1, 4):
self.treeView.setColumnHidden(col, True)
self.treeView.doubleClicked.connect(self.fold_choose)
def fold_choose(self, Qmodelidx):
# 选中文件夹
path = model01.filePath(Qmodelidx)
self.lineEdit.setText(path)
self.treeView.setVisible(False)
self.listWidget_init()
def listWidget_init(self):
# 在listWidget显示缩略图
PathData = []
filePath = self.lineEdit.text()
self.listWidget.clear()
if os.path.exists(filePath) :
path = filePath
PathDataSet = os.listdir(path)
else:
return
# 遍历判断拿到的文件是文件夹还是文件,Flase为文件,True为文件夹
for Data in range(len(PathDataSet)):
if self.file_extension(PathDataSet[Data]) == '.png' or self.file_extension(PathDataSet[Data]) == '.bmp' or self.file_extension(PathDataSet[Data]) == '.jpg':
PathData.append(PathDataSet[Data])
# print(PathDataSet[Data])
total = len(PathData)
for i in range(total):
url = filePath + "/" + PathData[i]
# print(url)
item = QListWidgetItem() # 创建QListWidgetItem对象
item.setText(PathData[i])
item.setIcon(QIcon(url))
self.listWidget.addItem(item)
# 获取文件后缀名
def file_extension(self, filePath):
return os.path.splitext(filePath)[1]
# 打开图片文件
def listWidget_dbclk(self):
imgId = self.listWidget.currentIndex().row()
file = self.lineEdit.text() + "/" + self.listWidget.item(imgId).text()
self.LoadImage(file)
在图片文件列表选中某个图片文件后,双击打开,就会在右侧显示。右侧区域是一个QScrollArea,图片则是由动态生成的QLabel加载。代码如下:
# 显示图片
def LoadImage(self, filePath):
img = QPixmap(filePath)
width = img.width()
height = img.height()
# 在scrollarea中动态生成加载图片的QLabel
self.qwidget = QWidget()
self.qwidget.setFixedSize(width, height)
self.label = QLabel(self.qwidget)
self.label.setFixedSize(width, height)
self.label.setPixmap(img)
self.scrollArea.setWidget(self.qwidget)
完整代码可以从CSDN的资源下载。
https://download.csdn.net/download/hydekong/87721854