QTreeWidget和QDockWidget

学习PyQt推荐大家看这本书:https://weread.qq.com/web/reader/6393267071ccfa97639f573

链接:https://pan.baidu.com/s/1fGG-o0DDkI2QUEMWxL7SHA 
提取码:oyb3

注意:QTreeWidget和QDockWidget_第1张图片

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_())

QTreeWidget和QDockWidget_第2张图片

你可能感兴趣的:(Pyqt5)