效果图:

目录和工具条的创建在前面几节就已经学过了,所以目录和工具条的布局可以自己画。

那么下面的部分,左侧是一个DockWidget,里面放置一个TreeWidget。右边是一个ScrollArea,里面放置一个Label,用来放置图片的。其他属性的设置可以按照自己的需求调节。

ui_treeWidget.py

# -*- coding: utf-8 -*-

# Form implementation generated from reading ui file 'ui_TreeWidget.ui'
#
# Created by: PyQt5 UI code generator 5.13.0
#
# WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object):
def setupUi(self, MainWindow):
MainWindow.setObjectName("MainWindow")
MainWindow.resize(1003, 600)
self.centralwidget = QtWidgets.QWidget(MainWindow)
self.centralwidget.setObjectName("centralwidget")
self.scrollArea = QtWidgets.QScrollArea(self.centralwidget)
self.scrollArea.setGeometry(QtCore.QRect(0, 0, 721, 491))
self.scrollArea.setWidgetResizable(True)
self.scrollArea.setObjectName("scrollArea")
self.scrollAreaWidgetContents = QtWidgets.QWidget()
self.scrollAreaWidgetContents.setGeometry(QtCore.QRect(0, 0, 719, 489))
self.scrollAreaWidgetContents.setObjectName("scrollAreaWidgetContents")
self.horizontalLayout_2 = QtWidgets.QHBoxLayout(self.scrollAreaWidgetContents)
self.horizontalLayout_2.setObjectName("horizontalLayout_2")
self.LabPicture = QtWidgets.QLabel(self.scrollAreaWidgetContents)
self.LabPicture.setText("")
self.LabPicture.setAlignment(QtCore.Qt.AlignCenter)
self.LabPicture.setObjectName("LabPicture")
self.horizontalLayout_2.addWidget(self.LabPicture)
self.scrollArea.setWidget(self.scrollAreaWidgetContents)
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtWidgets.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 1003, 21))
self.menubar.setObjectName("menubar")
self.menu = QtWidgets.QMenu(self.menubar)
self.menu.setObjectName("menu")
self.menu_2 = QtWidgets.QMenu(self.menubar)
self.menu_2.setObjectName("menu_2")
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtWidgets.QStatusBar(MainWindow)
self.statusbar.setObjectName("statusbar")
MainWindow.setStatusBar(self.statusbar)
self.toolBar = QtWidgets.QToolBar(MainWindow)
font = QtGui.QFont()
font.setPointSize(10)
self.toolBar.setFont(font)
self.toolBar.setToolButtonStyle(QtCore.Qt.ToolButtonTextUnderIcon)
self.toolBar.setObjectName("toolBar")
MainWindow.addToolBar(QtCore.Qt.TopToolBarArea, self.toolBar)
self.dockWidget = QtWidgets.QDockWidget(MainWindow)
self.dockWidget.setFeatures(QtWidgets.QDockWidget.AllDockWidgetFeatures)
self.dockWidget.setAllowedAreas(QtCore.Qt.LeftDockWidgetArea|QtCore.Qt.RightDockWidgetArea)
self.dockWidget.setObjectName("dockWidget")
self.dockWidgetContents = QtWidgets.QWidget()
self.dockWidgetContents.setObjectName("dockWidgetContents")
self.horizontalLayout = QtWidgets.QHBoxLayout(self.dockWidgetContents)
self.horizontalLayout.setObjectName("horizontalLayout")
self.treeWidget = QtWidgets.QTreeWidget(self.dockWidgetContents)
self.treeWidget.setObjectName("treeWidget")
self.treeWidget.headerItem().setText(0, "节点")
self.treeWidget.headerItem().setTextAlignment(0, QtCore.Qt.AlignCenter)
self.treeWidget.headerItem().setTextAlignment(1, QtCore.Qt.AlignCenter)
item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
item_1 = QtWidgets.QTreeWidgetItem(item_0)
item_2 = QtWidgets.QTreeWidgetItem(item_1)
item_1 = QtWidgets.QTreeWidgetItem(item_0)
item_2 = QtWidgets.QTreeWidgetItem(item_1)
self.treeWidget.header().setDefaultSectionSize(150)
self.horizontalLayout.addWidget(self.treeWidget)
self.dockWidget.setWidget(self.dockWidgetContents)
MainWindow.addDockWidget(QtCore.Qt.DockWidgetArea(1), self.dockWidget)
self.actTree_AddFolder = QtWidgets.QAction(MainWindow)
icon = QtGui.QIcon()
icon.addPixmap(QtGui.QPixmap("image/icon/AddFolder.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.actTree_AddFolder.setIcon(icon)
self.actTree_AddFolder.setObjectName("actTree_AddFolder")
self.actTree_AddFiles = QtWidgets.QAction(MainWindow)
icon1 = QtGui.QIcon()
icon1.addPixmap(QtGui.QPixmap("image/icon/AddFiles.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.actTree_AddFiles.setIcon(icon1)
self.actTree_AddFiles.setObjectName("actTree_AddFiles")
self.actZoomIn = QtWidgets.QAction(MainWindow)
icon2 = QtGui.QIcon()
icon2.addPixmap(QtGui.QPixmap("image/icon/ZoomIn.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.actZoomIn.setIcon(icon2)
self.actZoomIn.setObjectName("actZoomIn")
self.actZoomOut = QtWidgets.QAction(MainWindow)
icon3 = QtGui.QIcon()
icon3.addPixmap(QtGui.QPixmap("image/icon/ZoomOut.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.actZoomOut.setIcon(icon3)
self.actZoomOut.setObjectName("actZoomOut")
self.actZoomRealSize = QtWidgets.QAction(MainWindow)
icon4 = QtGui.QIcon()
icon4.addPixmap(QtGui.QPixmap("image/icon/ZoomRealSize.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.actZoomRealSize.setIcon(icon4)
self.actZoomRealSize.setObjectName("actZoomRealSize")
self.actTree_DeleteItem = QtWidgets.QAction(MainWindow)
icon5 = QtGui.QIcon()
icon5.addPixmap(QtGui.QPixmap("image/icon/delete.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.actTree_DeleteItem.setIcon(icon5)
self.actTree_DeleteItem.setObjectName("actTree_DeleteItem")
self.actZoomFitH = QtWidgets.QAction(MainWindow)
icon6 = QtGui.QIcon()
icon6.addPixmap(QtGui.QPixmap("image/icon/height.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.actZoomFitH.setIcon(icon6)
self.actZoomFitH.setObjectName("actZoomFitH")
self.actZoomFitW = QtWidgets.QAction(MainWindow)
icon7 = QtGui.QIcon()
icon7.addPixmap(QtGui.QPixmap("image/icon/width.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.actZoomFitW.setIcon(icon7)
self.actZoomFitW.setObjectName("actZoomFitW")
self.actTree_ScanItems = QtWidgets.QAction(MainWindow)
icon8 = QtGui.QIcon()
icon8.addPixmap(QtGui.QPixmap("image/icon/scanitem.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.actTree_ScanItems.setIcon(icon8)
self.actTree_ScanItems.setObjectName("actTree_ScanItems")
self.actDockFloat = QtWidgets.QAction(MainWindow)
self.actDockFloat.setCheckable(True)
icon9 = QtGui.QIcon()
icon9.addPixmap(QtGui.QPixmap("image/icon/dockfloat.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.actDockFloat.setIcon(icon9)
self.actDockFloat.setObjectName("actDockFloat")
self.actDockVisible = QtWidgets.QAction(MainWindow)
self.actDockVisible.setCheckable(True)
icon10 = QtGui.QIcon()
icon10.addPixmap(QtGui.QPixmap("image/icon/dockvisible.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.actDockVisible.setIcon(icon10)
self.actDockVisible.setObjectName("actDockVisible")
self.actClose = QtWidgets.QAction(MainWindow)
icon11 = QtGui.QIcon()
icon11.addPixmap(QtGui.QPixmap("image/icon/quit.jpg"), QtGui.QIcon.Normal, QtGui.QIcon.Off)
self.actClose.setIcon(icon11)
self.actClose.setObjectName("actClose")
self.menu.addAction(self.actTree_AddFolder)
self.menu.addAction(self.actTree_AddFiles)
self.menu.addAction(self.actTree_DeleteItem)
self.menu.addAction(self.actTree_ScanItems)
self.menu.addSeparator()
self.menu.addAction(self.actClose)
self.menu_2.addAction(self.actZoomIn)
self.menu_2.addAction(self.actZoomOut)
self.menu_2.addAction(self.actZoomRealSize)
self.menu_2.addSeparator()
self.menu_2.addAction(self.actZoomFitH)
self.menu_2.addAction(self.actZoomFitW)
self.menubar.addAction(self.menu.menuAction())
self.menubar.addAction(self.menu_2.menuAction())
self.toolBar.addAction(self.actTree_AddFolder)
self.toolBar.addAction(self.actTree_AddFiles)
self.toolBar.addAction(self.actTree_DeleteItem)
self.toolBar.addAction(self.actTree_ScanItems)
self.toolBar.addSeparator()
self.toolBar.addAction(self.actZoomIn)
self.toolBar.addAction(self.actZoomOut)
self.toolBar.addAction(self.actZoomRealSize)
self.toolBar.addAction(self.actZoomFitW)
self.toolBar.addAction(self.actZoomFitH)
self.toolBar.addSeparator()
self.toolBar.addAction(self.actDockFloat)
self.toolBar.addAction(self.actDockVisible)
self.toolBar.addSeparator()
self.toolBar.addAction(self.actClose) self.retranslateUi(MainWindow)
self.actClose.triggered.connect(MainWindow.close)
QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow):
_translate = QtCore.QCoreApplication.translate
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
self.menu.setTitle(_translate("MainWindow", "目录树"))
self.menu_2.setTitle(_translate("MainWindow", "视图"))
self.toolBar.setWindowTitle(_translate("MainWindow", "toolBar"))
self.dockWidget.setWindowTitle(_translate("MainWindow", "图片目录树"))
self.treeWidget.headerItem().setText(1, _translate("MainWindow", "节点类型"))
__sortingEnabled = self.treeWidget.isSortingEnabled()
self.treeWidget.setSortingEnabled(False)
self.treeWidget.topLevelItem(0).setText(0, _translate("MainWindow", "图片文件"))
self.treeWidget.topLevelItem(0).child(0).setText(0, _translate("MainWindow", "分组节点"))
self.treeWidget.topLevelItem(0).child(0).child(0).setText(0, _translate("MainWindow", "图片节点"))
self.treeWidget.topLevelItem(0).child(1).setText(0, _translate("MainWindow", "分组2"))
self.treeWidget.topLevelItem(0).child(1).child(0).setText(0, _translate("MainWindow", "图片2"))
self.treeWidget.setSortingEnabled(__sortingEnabled)
self.actTree_AddFolder.setText(_translate("MainWindow", "添加目录..."))
self.actTree_AddFolder.setToolTip(_translate("MainWindow", "添加目录"))
self.actTree_AddFolder.setShortcut(_translate("MainWindow", "Ctrl+F"))
self.actTree_AddFiles.setText(_translate("MainWindow", "添加文件..."))
self.actTree_AddFiles.setToolTip(_translate("MainWindow", "添加文件"))
self.actTree_AddFiles.setShortcut(_translate("MainWindow", "Ctrl+N"))
self.actZoomIn.setText(_translate("MainWindow", "放大"))
self.actZoomIn.setToolTip(_translate("MainWindow", "放大图片"))
self.actZoomIn.setShortcut(_translate("MainWindow", "Ctrl+I"))
self.actZoomOut.setText(_translate("MainWindow", "缩小"))
self.actZoomOut.setToolTip(_translate("MainWindow", "缩小图片"))
self.actZoomOut.setShortcut(_translate("MainWindow", "Ctrl+O"))
self.actZoomRealSize.setText(_translate("MainWindow", "实际大小"))
self.actZoomRealSize.setToolTip(_translate("MainWindow", "图片实际大小显示"))
self.actTree_DeleteItem.setText(_translate("MainWindow", "删除节点"))
self.actTree_DeleteItem.setToolTip(_translate("MainWindow", "删除节点"))
self.actZoomFitH.setText(_translate("MainWindow", "适合高度"))
self.actZoomFitH.setToolTip(_translate("MainWindow", "适合高度"))
self.actZoomFitH.setShortcut(_translate("MainWindow", "Ctrl+H"))
self.actZoomFitW.setText(_translate("MainWindow", "适合宽度"))
self.actZoomFitW.setToolTip(_translate("MainWindow", "适合宽度"))
self.actZoomFitW.setShortcut(_translate("MainWindow", "Ctrl+W"))
self.actTree_ScanItems.setText(_translate("MainWindow", "遍历节点"))
self.actTree_ScanItems.setToolTip(_translate("MainWindow", "遍历节点"))
self.actDockFloat.setText(_translate("MainWindow", "窗体浮动"))
self.actDockFloat.setToolTip(_translate("MainWindow", "窗体浮动"))
self.actDockVisible.setText(_translate("MainWindow", "窗体可见"))
self.actDockVisible.setToolTip(_translate("MainWindow", "窗体可见"))
self.actClose.setText(_translate("MainWindow", "退出"))
self.actClose.setToolTip(_translate("MainWindow", "退出"))

myMainWindow_TreeWidget.py

#!/usr/bin/env python
# _*_ coding: UTF-8 _*_
"""=================================================
@Project -> File : Operate-system -> myMainWindow_QtreeWidget.py
@IDE : PyCharm
@Author : zihan
@Date : 2020/4/17 8:50
@Desc :
=================================================""" import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTreeWidgetItem, QLabel, QFileDialog, QDockWidget
from enum import Enum
from PyQt5.QtGui import QIcon, QPixmap
from PyQt5.QtCore import pyqtSlot, Qt, QDir, QFileInfo
from ui_TreeWidget 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()
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.actTree_AddFolder.triggered.connect(self.do_act_tree_add_folder_triggered)
# 添加文件节点
self.ui.actTree_AddFiles.triggered.connect(self.do_act_tree_add_file_triggered)
# 删除节点
self.ui.actTree_DeleteItem.triggered.connect(self.do_act_zoom_delete_item_triggered)
# 遍历节点
self.ui.actTree_ScanItems.triggered.connect(self.do_act_tree_scan_item_triggered)
# 目录树上当前节点变化时
self.ui.treeWidget.currentItemChanged.connect(self.do_tree_widget_current_item_changed) # 适应高度显示图片
self.ui.actZoomFitH.triggered.connect(self.do_act_zoom_fith_triggerd)
# 适应宽度显示图片
self.ui.actZoomFitW.triggered.connect(self.do_act_zoom_fitw_triggered)
# 放大显示
self.ui.actZoomIn.triggered.connect(self.do_act_zoom_in_triggered)
# 缩小显示
self.ui.actZoomOut.triggered.connect(self.do_act_zoom_out_triggered)
# 实际大小
self.ui.actZoomRealSize.triggered.connect(self.do_act_zoom_realsize_triggered)
# 设置停靠区浮动性
self.ui.actDockFloat.triggered.connect(self.do_act_dock_float_triggered)
# 设置停靠区可见性
self.ui.actDockVisible.triggered.connect(self.do_act_dock_visible_triggered)
# 停靠区浮动性改变
self.ui.dockWidget.topLevelChanged.connect(self.do_dock_widget_toplevelchanged)
# 停靠区可见性改变
self.ui.dockWidget.visibilityChanged.connect(self.do_dock_widget_visibilitychanged) def __iniTree(self): # 初始化目录树
self.ui.treeWidget.clear()
icon = QIcon("./image/icon/pic.jpg") # 创建节点
item = QTreeWidgetItem(TreeItemType.itTopItem.value)
item.setIcon(TreeColNum.colItem.value, icon)
item.setText(TreeColNum.colItem.value, "图片文件")
item.setFlags(self.itemFlags)
item.setCheckState(TreeColNum.colItem.value, Qt.Checked)
item.setData(TreeColNum.colItem.value, Qt.UserRole, "")
self.ui.treeWidget.addTopLevelItem(item) # 添加目录节点
def do_act_tree_add_folder_triggered(self):
dirStr = QFileDialog.getExistingDirectory() # 选择目录
if dirStr == "":
return
parItem = self.ui.treeWidget.currentItem() # 当前节点
if parItem is None:
parItem = self.ui.treeWidget.topLevelItem(0)
icon = QIcon("./image/icon/AddFolder.jpg")
dirObj = QDir(dirStr) # QDir对象
nodeText = dirObj.dirName() # 最后一级目录的名称 item = QTreeWidgetItem(TreeItemType.itGroupItem.value) # 节点类型
item.setIcon(TreeColNum.colItem.value, icon)
item.setText(TreeColNum.colItem.value, nodeText) # 第一列
item.setText(TreeColNum.colItemType.value, "Group") # 第二列
# 设置文字居中
item.setTextAlignment(TreeColNum.colItemType.value, Qt.AlignCenter)
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) # 添加文件节点
def do_act_tree_add_file_triggered(self):
fileList, flt = QFileDialog.getOpenFileNames(self, "选择一个或多个文件", "", "Images(*.jpg)")
if len(fileList) < 1:
return
item = self.ui.treeWidget.currentItem() # 当前节点
if item.type() == TreeItemType.itImageItem.value:
parItem = item.parent() # 当前是图片节点
else:
parItem = item icon = QIcon("./image/icon/onepic.jpg")
for i in range(len(fileList)):
fullFileName = fileList[i] # 带路径文件名
fileinfo = QFileInfo(fullFileName)
nodeText = fileinfo.fileName() # 不带路径文件名
item = QTreeWidgetItem(TreeItemType.itImageItem.value) # 节点类型
item.setIcon(TreeColNum.colItem.value, icon) # 第一列的图标
item.setText(TreeColNum.colItem.value, nodeText) # 第一列的文字
item.setText(TreeColNum.colItemType.value, "Image") # 第二列的文字
# 设置文字居中
item.setTextAlignment(TreeColNum.colItemType.value, Qt.AlignCenter)
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 do_act_zoom_delete_item_triggered(self):
item = self.ui.treeWidget.currentItem()
parItem = item.parent()
parItem.removeChild(item) # 遍历节点
def do_act_tree_scan_item_triggered(self):
cout = self.ui.treeWidget.topLevelItemCount()
for i in range(cout):
item = self.ui.treeWidget.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 do_tree_widget_current_item_changed(self, current, previous):
if current is None:
return
nodeType = current.type() # 获取节点类型
if nodeType == TreeItemType.itTopItem.value:
self.ui.actTree_AddFolder.setEnabled(True)
self.ui.actTree_AddFiles.setEnabled(True)
self.ui.actTree_DeleteItem.setEnabled(False)
elif nodeType == TreeItemType.itGroupItem.value:
self.ui.actTree_AddFolder.setEnabled(True)
self.ui.actTree_AddFiles.setEnabled(True)
self.ui.actTree_DeleteItem.setEnabled(True)
elif nodeType == TreeItemType.itImageItem.value:
self.ui.actTree_AddFolder.setEnabled(False)
self.ui.actTree_AddFiles.setEnabled(True)
self.ui.actTree_DeleteItem.setEnabled(True)
self.__displayImage(current) # 显示图片 def __displayImage(self, item): # 显示节点item的图片
filename = item.data(TreeColNum.colItem.value, Qt.UserRole)
self.ui.statusbar.showMessage(filename) # 状态栏显示文件名
self.curPixmap.load(filename) # 原始图片
self.do_act_zoom_fith_triggerd()
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) # 适应高度显示图片
def do_act_zoom_fith_triggerd(self):
H = self.ui.scrollArea.height() # 得到scrollArea的高度
realH = self.curPixmap.height() # 原始图片的实际高度
self.pixRatio = float(H) / realH # 当前显示比例,必须转换为浮点数
pix = self.curPixmap.scaledToHeight(H - 30) # 图片缩放到指定高度
self.ui.LabPicture.setPixmap(pix) # 设置Lable的PixMap # 适应宽度显示图片
def do_act_zoom_fitw_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) # 放大显示
def do_act_zoom_in_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) # 缩小显示
def do_act_zoom_out_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) # 实际大小
def do_act_zoom_realsize_triggered(self):
self.pixRatio = 1
self.ui.LabPicture.setPixmap(self.curPixmap) # 设置停靠区浮动性
@pyqtSlot(bool)
def do_act_dock_float_triggered(self, checked):
self.ui.dockWidget.setFloating(checked) # 设置停靠区可见性
@pyqtSlot(bool)
def do_act_dock_visible_triggered(self, checked):
self.ui.dockWidget.setVisible(checked) # 停靠区浮动性改变
@pyqtSlot(bool)
def do_dock_widget_toplevelchanged(self, topLevel):
self.ui.actDockFloat.setChecked(topLevel) # 停靠区可见性改变
@pyqtSlot(bool)
def do_dock_widget_visibilitychanged(self, visible):
self.ui.actDockVisible.setChecked(visible) if __name__ == "__main__":
app = QApplication(sys.argv) # 创建app,用QApplication类
form = QmyMainWindow()
form.show()
sys.exit(app.exec_())

ok。

里面有一个方法,感觉还不错,就是把节点类型和目录树的列号都作为一个类,方便阅读,很清晰。

第十七篇 -- QTreeWidget与QDockWidget的更多相关文章

  1. 第二十七篇 -- QTreeWidget总结

    前言 之前写过几篇关于TreeWidget的文章,不过不方便查阅,特此重新整合作为总结.不过关于QtDesigner画图,还是不重新写了,看 第一篇 就OK. 准备工作 1. 用QtDesigner画 ...

  2. 解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译)

    解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译) http://improve.dk/corrupting-databases-purpose-usin ...

  3. Python之路【第十七篇】:Django【进阶篇 】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  4. Python之路【第十七篇】:Django之【进阶篇】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  5. Python之路【第十七篇】:Django【进阶篇】

    Python之路[第十七篇]:Django[进阶篇 ]   Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...

  6. 跟我学SpringCloud | 第十七篇:服务网关Zuul基于Apollo动态路由

    目录 SpringCloud系列教程 | 第十七篇:服务网关Zuul基于Apollo动态路由 Apollo概述 Apollo相比于Spring Cloud Config优势 工程实战 示例代码 Spr ...

  7. Egret入门学习日记 --- 第十七篇(书中 7.4~8.2节 内容)

    第十七篇(书中 7.4~8.2节 内容) 昨天看到 7.3 节,那么今天. 开始 7.4节.     好吧,这些其他的服务器运行知识,就不搞了... 至此,7.4节 内容结束. 开始 7.5节 内容. ...

  8. 第十七篇:实例分析(1)--初探WDDM驱动学习笔记(八)

    第四篇(VidPN)中提到过MIRROR驱动. 在进入本篇的实际内容前, 带着好奇心, 想请教CSDN中的显卡驱动方面的大虾, 怎样才干把这个驱动玩起来, 这个驱动的作用是什么,等等, 敬请不吝赐教. ...

  9. 第十七篇 --ANDROID DisplayManager 服务解析一

    ANDROID从版本4.2开始提供了一个显示管理服务DisplayManagerService,支持多种显示类型的多个显示器的镜像显示,包括内建的显示类型(本地).HDMI显示类型以及支持WIFI D ...

随机推荐

  1. centos7 配置国内yum源

    配置清华大学镜像仓库 URL:https://mirrors.cnnic.cn/ CentOS 镜像使用帮助 https://mirrors.cnnic.cn/help/centos/ 建议先备份 C ...

  2. 剑指0ffer59.滑动窗口的最大值

    给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] ...

  3. 测试MySQL锁的问题

    测试MySQL锁的问题 目录 测试MySQL锁的问题 1 Record Lock 2 Next-Key Lock 2 死锁测试 InnoDB支持三种行锁: Record Lock:单个行记录上面的锁 ...

  4. VScode如何设置模板字符串html标签自动补全

    在学习Vue的过程中,很多时候都需要用到模板字符串,但是里面的html标签一个字符一个字符的去敲未免也太麻烦了吧,其实我们可以通过设置来实现在模板字符串中按Tab键快速补全html标签. 1.在VSC ...

  5. VisualEffectGraph概述

    Visual Effect Graph 由来: Visual Effect Graph 是2018.3 以后版本,出的新的粒子特效技术.它是用显卡渲染特效,区别于传统的Patical system 的 ...

  6. 精尽Spring Boot源码分析 - Condition 接口的扩展

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  7. HDU 4821 2013长春现场赛hash

    题意: 一个字符串S  问其中有几个子串能满足以下条件: 1.长度为M*L 2.可以被分成M个L长的小串  每个串都不一样 分析: hash方法,一个种子base,打表出nbase[i]表示base的 ...

  8. jenkins pipeline构建后返回构建结果给gitlab

    jenkins pipeline构建后返回构建结果给gitlab 使用场景 gitlab 合并请求时要求管道任务必须成功,否则无法执行合并操作,又不想使用gitlab ci 工具. 实现方法 1.Ge ...

  9. HTTP:HTTP请求头和响应头详解

    HTTP请求报文 HTTP 请求报文由3部分组成(请求行+请求头+请求体) HTTP请求报文分析  1. 是请求方法,GET和POST是最常见的HTTP方法,初次以外还包括 DELETE.HEAD.O ...

  10. kafka错误集锦

    javax.management.InstanceAlreadyExistsException: kafka.consumer:type=FetchRequestAndResponseMetrics, ...