学习PyQt推荐大家看这本书:https://weread.qq.com/web/reader/6393267071ccfa97639f573
链接:https://pan.baidu.com/s/1fGG-o0DDkI2QUEMWxL7SHA
提取码:oyb3
import sys
from PyQt5.QtWidgets import (QApplication,QMainWindow,QTreeWidgetItem,QLabel,QFileDialog,QDockWidget)
from enum import Enum#枚举类型
from PyQt5 import QtCore
from PyQt5.QtCore import pyqtSlot,Qt,QDir,QFileInfo
from PyQt5.QtGui import QIcon,QPixmap
from ui_Mainwindow import Ui_MainWindow
class TreeItemType(Enum):#节点类型的枚举
itTopItem=1001 #顶层节点
itGroupItem=1002 #组节点
itImageItem=1003 #图片文件节点
class TreeColNum(Enum):#目录树的列号的枚举类型
colItem=0 #分组/文件名列
colItemType=1 #节点类型列
class QmyMainWindow(QMainWindow):
def __init__(self, parent=None):
super().__init__(parent)
self.ui=Ui_MainWindow()#创建UI
self.ui.setupUi(self)
self.curPixmap=QPixmap()#图片
self.pixRatio=1 #显示比例
self.itemFlags=(Qt.ItemIsSelectable|Qt.ItemIsUserCheckable|Qt.ItemIsEnabled|Qt.ItemIsAutoTristate)#节点标志
self.setCentralWidget(self.ui.scrollArea)
self.__iniTree()
self.ui.dockWidget.setFeatures(QDockWidget.AllDockWidgetFeatures)
self.ui.dockWidget.setAllowedAreas(Qt.LeftDockWidgetArea|Qt.RightDockWidgetArea)
self.ui.scrollArea.setWidgetResizable(True)#自动调整内部组件大小
self.ui.scrollArea.setAlignment(Qt.AlignCenter)
self.ui.LabPicture.setAlignment(Qt.AlignCenter)
def __iniTree(self):
self.ui.treeFiles.clear()
#创建节点
# print("init")
item=QTreeWidgetItem(TreeItemType.itTopItem.value)
item.setText(TreeColNum.colItem.value,"图片文件e")
item.setFlags(self.itemFlags)
item.setCheckState(TreeColNum.colItem.value,Qt.Checked)
item.setData(TreeColNum.colItem.value,Qt.UserRole,"")
self.ui.treeFiles.addTopLevelItem(item)
@pyqtSlot()
# actTree_AddFolder是用于添加组节点的Action,
# 只有当目录树上的当前节点类型是itTopItem或
# itGroupItem时才可以添加组节点。
def on_actTreeAddFolder_triggered(self):
dirStr=QFileDialog.getExistingDirectory()#选择目录
if(dirStr==""):
return
parItem=self.ui.treeFiles.currentItem()#当前节点
if(parItem==None):
parItem=self.ui.treeFiles.topLevelItem(0)
dirObj=QDir(dirStr)#QDir对象
nodeText=dirObj.dirName()#最后一级目录的名称
item=QTreeWidgetItem(TreeItemType.itGroupItem.value)#节点类型
item.setText(TreeColNum.colItem.value,nodeText)#第一列
item.setText(TreeColNum.colItemType.value,"Group")#第2列
item.setFlags(self.itemFlags)
item.setCheckState(TreeColNum.colItem.value,Qt.Checked)
item.setData(TreeColNum.colItem.value,Qt.UserRole,dirStr)#关联数据
parItem.addChild(item)
parItem.setExpanded(True)#展开节点
# print("true")
@pyqtSlot()
# actTree_AddFiles是添加图片文件节点的Action,
# 当目录树的当前节点为任何类型时这个Action都可用
def on_actTreeAddFiles_triggered(self):
fileList,flt=QFileDialog.getOpenFileNames(self,"选择一个或多个文件","","Images(*.jpg)")
if(len(fileList)<1):
return
item=self.ui.treeFiles.currentItem()#当前节点
if(item.type()==TreeItemType.itImageItem.value):#当前是图片节点
parItem=item.parent()
else:#否则取当前节点为父节点
parItem=item
for i in range(len(fileList)):
fullFileName=fileList[i]#带文件路径名
fileinfo=QFileInfo(fullFileName)
nodeText=fileinfo.fileName()#不带文件路径文件名
item=QTreeWidgetItem(TreeItemType.itImageItem.value)#节点类型
#第一列文字
item.setText(TreeColNum.colItem.value,nodeText)
#第二列文字
item.setText(TreeColNum.colItemType.value,"Image")
item.setFlags(self.itemFlags)
item.setCheckState(TreeColNum.colItem.value,Qt.Checked)
item.setData(TreeColNum.colItem.value,Qt.UserRole,fullFileName)
parItem.addChild(item)
parItem.setExpanded(True)#展开节点
def on_treeFiles_currentItemChanged(self,current,previous):
if(current==None):
return
nodeType=current.type()#获取节点类型
if(nodeType==TreeItemType.itTopItem.value):#顶层节点
self.ui.actTreeAddFolder.setEnabled(True)
self.ui.actTreeAddFiles.setEnabled(True)
self.ui.actTreeDelItem.setEnabled(False)
print("aaaaa")
elif(nodeType==TreeItemType.itGroupItem.value):
self.ui.actTreeAddFolder.setEnabled(True)
self.ui.actTreeAddFiles.setEnabled(True)
self.ui.actTreeDelItem.setEnabled(True)
print("helloaaa")
elif(nodeType==TreeItemType.itImageItem.value):
self.ui.actTreeAddFolder.setEnabled(False)
self.ui.actTreeAddFiles.setEnabled(True)
self.ui.actTreeDelItem.setEnabled(True)
print("hello")
self.__displayImage(current)#显示图片
@pyqtSlot()
def on_actTreeDelItem_triggered(self):
item=self.ui.treeFiles.currentItem()
print("del")
parItem=item.parent()
parItem.removeChild(item)
@pyqtSlot()
def on_actTreeScanItems_triggered(self):
count=self.ui.treeFiles.topLevelItemCount()
for i in range(count):
item=self.ui.treeFiles.topLevelItem(i)
self.__changeItemCaption(item)
def __changeItemCaption(self,item):#递归调用函数,修改节点标题
title="*"+item.text(TreeColNum.colItem.value)
item.setText(TreeColNum.colItem.value,title)
if(item.childCount()>0):
for i in range(item.childCount()):
self.__changeItemCaption(item.child(i))
def __displayImage(self,item):
filename=item.data(TreeColNum.colItem.value,Qt.UserRole)
self.ui.statusbar.showMessage(filename)#状态栏显示文件名
self.curPixmap.load(filename)#原始图片
# print("hello:",filename)
self.on_actZoomFitH_triggered()#适合高度显示
self.ui.actZoomFitH.setEnabled(True)
self.ui.actZoomFitW.setEnabled(True)
self.ui.actZoomIn.setEnabled(True)
self.ui.actZoomOut.setEnabled(True)
self.ui.actZoomRealSize.setEnabled(True)
@pyqtSlot()
def on_actZoomFitH_triggered(self):
H=self.ui.scrollArea.height()
realH=self.curPixmap.height()#原始高度
self.pixRatio=float(H)/realH
pix=self.curPixmap.scaledToHeight(H-30)
self.ui.LabPicture.setPixmap(pix)
@pyqtSlot()
def on_actZoomFitW_triggered(self):
W=self.ui.scrollArea.width()-20
realW=self.curPixmap.width()
self.pixRatio=float(W)/realW
pix=self.curPixmap.scaledToWidth(W-30)
self.ui.LabPicture.setPixmap(pix)
@pyqtSlot()
def on_actZoomIn_triggered(self):
self.pixRatio=self.pixRatio*1.2
W=self.pixRatio*self.curPixmap.width()
H=self.pixRatio*self.curPixmap.height()
pix=self.curPixmap.scaled(W,H)
self.ui.LabPicture.setPixmap(pix)
@pyqtSlot()
def on_actZoomOut_triggered(self):
self.pixRatio=self.pixRatio*0.8
W=self.pixRatio*self.curPixmap.width()
H=self.pixRatio*self.curPixmap.height()
pix=self.curPixmap.scaled(W,H)
self.ui.LabPicture.setPixmap(pix)
@pyqtSlot()
def on_actZoomRealSize_triggered(self):
self.pixRatio=1
self.ui.LabPicture.setPixmap(self.curPixmap)
@pyqtSlot()
def on_actDockFloat_triggered(self,checked):
self.ui.dockWidget.setFloating(checked)
@pyqtSlot()
def on_actDockVisible_triggered(self,checked):
self.ui.dockWidget.setVisible(checked)
@pyqtSlot()
def on_dockWidget_topLevelChanged(self,topLevel):
self.ui.actDockFloat.setChecked(topLevel)
@pyqtSlot()
def on_dockWidget_visibilityChanged(self,visible):
self.ui.actDockVisible.setChanged(visible)
if __name__=="__main__":
QtCore.QCoreApplication.setAttribute(QtCore.Qt.AA_EnableHighDpiScaling)#自适应缩放
app=QApplication(sys.argv)
form=QmyMainWindow()
form.show()
sys.exit(app.exec_())