效果图:

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

那么下面的部分,左侧是一个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. NX二次开发-获取面的外围边和孔槽边

    函数: UF_MODL_ask_face_loops()  获取面的所有封闭边组合(多组edge) UF_MODL_ask_loop_list_count() 获取loop的数量(面上孔.槽的数量+1 ...

  2. 空闲时间研究一个小功能:winform桌面程序如何实现动态更换桌面图标

    今天休息在家,由于天气热再加上疫情原因,就在家里呆着,空闲时想着,在很早以前(约3年前),产品人员跟我提了一个需求,那就是winform桌面程序的图标能否根据节日动态更换,这种需求在移动APP上还是比 ...

  3. 深度解密:Java与线程的关系

    并发不一定要依赖多线程(如PHP的多进程并发),但在Java中谈论并发,大多数都与线程脱不开关系. 线程的实现 线程是CPU调度的基本单位,Thread类与大部分的Java API有显著的差别,它的所 ...

  4. 『心善渊』Selenium3.0基础 — 12、Selenium操作鼠标和键盘事件

    目录 (一)对鼠标的操作 1.鼠标事件介绍 2.ActionChains 类鼠标操作的常用方法 3.perform()方法 4.鼠标事件操作步骤 5.示例 (1)右键单击.左键双击 (2)鼠标拖拽动作 ...

  5. Kubernetes之无头服务(headless)

    己经看到如何使用服务来提供稳定的ip地址,从而允许客户端连接到支持服务的每个pod (或其他端点).到服务的每个连接都被转发到一个随机选择的pod上.但是如果客户端需要链接到所有的pod呢?如果后端的 ...

  6. QQ邮箱获取授权码方法

    1.登录QQ邮箱,点击"设置" 2.点击"账户" 3.开启POP3/SMTP服务 4.点击"生成授权码" 5.完成验证后,即可生成授权码 P ...

  7. ansible 任务执行

    ansible 任务执行模式 Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook: ad-hoc模式(点对点模式)• ad-hoc模式(点对点模式) 使用单个 ...

  8. centos 关闭SELINUX并重启系统

    关闭SELINUX [root@bogon ~]# vim /etc/sysconfig/selinux  ... SELINUX=disabled ... 执行过程: 重启系统 [root@bogo ...

  9. redis集群搭建中遇到的一些问题

    redis单机模式启动后,修改完配置文件,使用以下命令创建redis集群: sudo ./src/redis-trib.rb create --replicas 1 ip1:6379 ip2:6379 ...

  10. PHP解决并发问题的几种实现(转)

      对于商品抢购等并发场景下,可能会出现超卖的现象,这时就需要解决并发所带来的这些问题了 在PHP语言中并没有原生的提供并发的解决方案,因此就需要借助其他方式来实现并发控制. 方案一:使用文件锁排它锁 ...