效果图:

自己画一个ui,如图,前面已经讲过怎么用Qt Designer画图了,现在就不赘述了。

ui_play.py

  1. # -*- coding: utf-8 -*-
  2.  
  3. # Form implementation generated from reading ui file 'ui_play2.ui'
  4. #
  5. # Created by: PyQt5 UI code generator 5.13.0
  6. #
  7. # WARNING! All changes made in this file will be lost!
  8.  
  9. from PyQt5 import QtCore, QtGui, QtWidgets
  10.  
  11. class Ui_Form(object):
  12. def setupUi(self, Form):
  13. Form.setObjectName("Form")
  14. Form.resize(422, 375)
  15. self.treeWidget = QtWidgets.QTreeWidget(Form)
  16. self.treeWidget.setGeometry(QtCore.QRect(10, 10, 401, 351))
  17. self.treeWidget.setObjectName("treeWidget")
  18. self.treeWidget.headerItem().setTextAlignment(0, QtCore.Qt.AlignCenter)
  19. font = QtGui.QFont()
  20. font.setPointSize(14)
  21. font.setBold(True)
  22. font.setWeight(75)
  23. self.treeWidget.headerItem().setFont(0, font)
  24. self.treeWidget.headerItem().setBackground(0, QtGui.QColor(170, 255, 0))
  25. brush = QtGui.QBrush(QtGui.QColor(170, 85, 255))
  26. brush.setStyle(QtCore.Qt.SolidPattern)
  27. self.treeWidget.headerItem().setForeground(0, brush)
  28. self.treeWidget.headerItem().setTextAlignment(1, QtCore.Qt.AlignCenter)
  29. font = QtGui.QFont()
  30. font.setPointSize(14)
  31. font.setBold(True)
  32. font.setWeight(75)
  33. self.treeWidget.headerItem().setFont(1, font)
  34. self.treeWidget.headerItem().setBackground(1, QtGui.QColor(170, 255, 127))
  35. brush = QtGui.QBrush(QtGui.QColor(170, 85, 255))
  36. brush.setStyle(QtCore.Qt.SolidPattern)
  37. self.treeWidget.headerItem().setForeground(1, brush)
  38. item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
  39. brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))
  40. brush.setStyle(QtCore.Qt.SolidPattern)
  41. item_0.setBackground(0, brush)
  42. brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))
  43. brush.setStyle(QtCore.Qt.SolidPattern)
  44. item_0.setBackground(1, brush)
  45. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  46. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  47. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  48. item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
  49. brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))
  50. brush.setStyle(QtCore.Qt.SolidPattern)
  51. item_0.setBackground(0, brush)
  52. brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))
  53. brush.setStyle(QtCore.Qt.SolidPattern)
  54. item_0.setBackground(1, brush)
  55. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  56. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  57. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  58. item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
  59. brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))
  60. brush.setStyle(QtCore.Qt.SolidPattern)
  61. item_0.setBackground(0, brush)
  62. brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))
  63. brush.setStyle(QtCore.Qt.SolidPattern)
  64. item_0.setBackground(1, brush)
  65. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  66. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  67. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  68. item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
  69. brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))
  70. brush.setStyle(QtCore.Qt.SolidPattern)
  71. item_0.setBackground(0, brush)
  72. brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))
  73. brush.setStyle(QtCore.Qt.SolidPattern)
  74. item_0.setBackground(1, brush)
  75. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  76. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  77. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  78. item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
  79. brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))
  80. brush.setStyle(QtCore.Qt.SolidPattern)
  81. item_0.setBackground(0, brush)
  82. brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))
  83. brush.setStyle(QtCore.Qt.SolidPattern)
  84. item_0.setBackground(1, brush)
  85. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  86. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  87. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  88. item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
  89. brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))
  90. brush.setStyle(QtCore.Qt.SolidPattern)
  91. item_0.setBackground(0, brush)
  92. brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))
  93. brush.setStyle(QtCore.Qt.SolidPattern)
  94. item_0.setBackground(1, brush)
  95. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  96. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  97. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  98. item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget)
  99. brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))
  100. brush.setStyle(QtCore.Qt.SolidPattern)
  101. item_0.setBackground(0, brush)
  102. brush = QtGui.QBrush(QtGui.QColor(85, 255, 255))
  103. brush.setStyle(QtCore.Qt.SolidPattern)
  104. item_0.setBackground(1, brush)
  105. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  106. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  107. item_1 = QtWidgets.QTreeWidgetItem(item_0)
  108.  
  109. self.retranslateUi(Form)
  110. QtCore.QMetaObject.connectSlotsByName(Form)
  111.  
  112. def retranslateUi(self, Form):
  113. _translate = QtCore.QCoreApplication.translate
  114. Form.setWindowTitle(_translate("Form", "Form"))
  115. self.treeWidget.headerItem().setText(0, _translate("Form", "姓名"))
  116. self.treeWidget.headerItem().setText(1, _translate("Form", "信息"))
  117. __sortingEnabled = self.treeWidget.isSortingEnabled()
  118. self.treeWidget.setSortingEnabled(False)
  119. self.treeWidget.topLevelItem(0).setText(0, _translate("Form", "张三"))
  120. self.treeWidget.topLevelItem(0).child(0).setText(0, _translate("Form", "性别"))
  121. self.treeWidget.topLevelItem(0).child(0).setText(1, _translate("Form", "男"))
  122. self.treeWidget.topLevelItem(0).child(1).setText(0, _translate("Form", "年龄"))
  123. self.treeWidget.topLevelItem(0).child(1).setText(1, _translate("Form", "18"))
  124. self.treeWidget.topLevelItem(0).child(2).setText(0, _translate("Form", "爱好"))
  125. self.treeWidget.topLevelItem(0).child(2).setText(1, _translate("Form", "LOL"))
  126. self.treeWidget.topLevelItem(1).setText(0, _translate("Form", "李四"))
  127. self.treeWidget.topLevelItem(1).child(0).setText(0, _translate("Form", "性别"))
  128. self.treeWidget.topLevelItem(1).child(0).setText(1, _translate("Form", "男"))
  129. self.treeWidget.topLevelItem(1).child(1).setText(0, _translate("Form", "年龄"))
  130. self.treeWidget.topLevelItem(1).child(1).setText(1, _translate("Form", "20"))
  131. self.treeWidget.topLevelItem(1).child(2).setText(0, _translate("Form", "爱好"))
  132. self.treeWidget.topLevelItem(1).child(2).setText(1, _translate("Form", "DOTA"))
  133. self.treeWidget.topLevelItem(2).setText(0, _translate("Form", "王五"))
  134. self.treeWidget.topLevelItem(2).child(0).setText(0, _translate("Form", "性别"))
  135. self.treeWidget.topLevelItem(2).child(0).setText(1, _translate("Form", "男"))
  136. self.treeWidget.topLevelItem(2).child(1).setText(0, _translate("Form", "年龄"))
  137. self.treeWidget.topLevelItem(2).child(1).setText(1, _translate("Form", "22"))
  138. self.treeWidget.topLevelItem(2).child(2).setText(0, _translate("Form", "爱好"))
  139. self.treeWidget.topLevelItem(2).child(2).setText(1, _translate("Form", "麻将"))
  140. self.treeWidget.topLevelItem(3).setText(0, _translate("Form", "芳芳"))
  141. self.treeWidget.topLevelItem(3).child(0).setText(0, _translate("Form", "性别"))
  142. self.treeWidget.topLevelItem(3).child(0).setText(1, _translate("Form", "女"))
  143. self.treeWidget.topLevelItem(3).child(1).setText(0, _translate("Form", "年龄"))
  144. self.treeWidget.topLevelItem(3).child(1).setText(1, _translate("Form", "20"))
  145. self.treeWidget.topLevelItem(3).child(2).setText(0, _translate("Form", "爱好"))
  146. self.treeWidget.topLevelItem(3).child(2).setText(1, _translate("Form", "看书"))
  147. self.treeWidget.topLevelItem(4).setText(0, _translate("Form", "小智"))
  148. self.treeWidget.topLevelItem(4).child(0).setText(0, _translate("Form", "性别"))
  149. self.treeWidget.topLevelItem(4).child(0).setText(1, _translate("Form", "男"))
  150. self.treeWidget.topLevelItem(4).child(1).setText(0, _translate("Form", "年龄"))
  151. self.treeWidget.topLevelItem(4).child(1).setText(1, _translate("Form", "25"))
  152. self.treeWidget.topLevelItem(4).child(2).setText(0, _translate("Form", "爱好"))
  153. self.treeWidget.topLevelItem(4).child(2).setText(1, _translate("Form", "解说"))
  154. self.treeWidget.topLevelItem(5).setText(0, _translate("Form", "婷婷"))
  155. self.treeWidget.topLevelItem(5).child(0).setText(0, _translate("Form", "性别"))
  156. self.treeWidget.topLevelItem(5).child(0).setText(1, _translate("Form", "女"))
  157. self.treeWidget.topLevelItem(5).child(1).setText(0, _translate("Form", "年龄"))
  158. self.treeWidget.topLevelItem(5).child(1).setText(1, _translate("Form", "27"))
  159. self.treeWidget.topLevelItem(5).child(2).setText(0, _translate("Form", "爱好"))
  160. self.treeWidget.topLevelItem(5).child(2).setText(1, _translate("Form", "健身"))
  161. self.treeWidget.topLevelItem(6).setText(0, _translate("Form", "大熊"))
  162. self.treeWidget.topLevelItem(6).child(0).setText(0, _translate("Form", "性别"))
  163. self.treeWidget.topLevelItem(6).child(0).setText(1, _translate("Form", "男"))
  164. self.treeWidget.topLevelItem(6).child(1).setText(0, _translate("Form", "年龄"))
  165. self.treeWidget.topLevelItem(6).child(1).setText(1, _translate("Form", "14"))
  166. self.treeWidget.topLevelItem(6).child(2).setText(0, _translate("Form", "爱好"))
  167. self.treeWidget.topLevelItem(6).child(2).setText(1, _translate("Form", "睡觉"))
  168. self.treeWidget.setSortingEnabled(__sortingEnabled)

play_py

  1. #!/usr/bin/env python
  2. # _*_ coding: UTF-8 _*_
  3. """=================================================
  4. @Project -> File : FDS -> play2.py
  5. @IDE : PyCharm
  6. @Author : zihan
  7. @Date : 2020/5/13 10:41
  8. @Desc :
  9. ================================================="""
  10.  
  11. import sys
  12. from PyQt5.QtWidgets import QApplication, QWidget, QMenu, QMessageBox
  13. from PyQt5.QtCore import Qt
  14. from ui_play2 import Ui_Form
  15.  
  16. class QmyWidget(QWidget):
  17. def __init__(self, parent=None):
  18. super().__init__(parent) # 调用父类构造函数
  19. self.ui = Ui_Form() # 创建UI对象
  20. self.ui.setupUi(self) # 构造UI
  21.  
  22. self.ui.treeWidget.expandAll()
  23. self.ui.treeWidget.setColumnWidth(0, 200)
  24. self.ui.treeWidget.setStyleSheet("QHeaderView::section{background:rgb(85, 170, 127);}")
  25.  
  26. self.ui.treeWidget.setContextMenuPolicy(Qt.CustomContextMenu)
  27. self.ui.treeWidget.customContextMenuRequested.connect(self.do_custom_context_menu_request)
  28.  
  29. def do_custom_context_menu_request(self, pos):
  30. # row_num = -1 # 当前节点的行号
  31. parent_num = -1 # 存放当前行的父节点的行号
  32. for i in self.ui.treeWidget.selectionModel().selection().indexes():
  33. # row_num = i.row()
  34. parent_num = i.parent().row()
  35. # print(parent_num)
  36. # print(row_num)
  37. if parent_num == -1:
  38. pass
  39. else:
  40. menu = QMenu()
  41. item1 = menu.addAction(u"选项一")
  42. item2 = menu.addAction(u"选项二")
  43. item3 = menu.addAction(u"选项三")
  44. action = menu.exec_(self.ui.treeWidget.mapToGlobal(pos))
  45. if action == item1:
  46. QMessageBox.information(self, "消息框标题", "你选择了:选项一", QMessageBox.Yes | QMessageBox.No)
  47. print("you select 1")
  48. elif action == item2:
  49. QMessageBox.information(self, "消息框标题", "你选择了:选项二", QMessageBox.Yes | QMessageBox.No)
  50. print("you select 2")
  51. elif action == item3:
  52. QMessageBox.information(self, "消息框标题", "你选择了:选项三", QMessageBox.Yes | QMessageBox.No)
  53. print("you select 3")
  54. else:
  55. return
  56.  
  57. if __name__ == '__main__':
  58. app = QApplication(sys.argv) # 创建app
  59. form = QmyWidget()
  60. form.show()
  61. sys.exit(app.exec_())

这就可以实现右击菜单了。关键是有两句话

  1. self.ui.treeWidget.setContextMenuPolicy(Qt.CustomContextMenu) # 允许右击菜单
  2. self.ui.treeWidget.customContextMenuRequested.connect(self.do_custom_context_menu_request) # 右击时触发函数

这是关键。

第二十五篇 -- QTreeWidget右击菜单的实现的更多相关文章

  1. 第二十五篇:在SOUI中做事件分发处理

    不同的SOUI控件可以产生不同的事件.SOUI系统中提供了两种事件处理方式:事件订阅 + 事件处理映射表(参见第八篇:SOUI中控件事件的响应) 事件订阅由于直接将事件及事件处理函数连接,不存在事件分 ...

  2. Python之路(第二十五篇) 面向对象初级:反射、内置方法

    [TOC] 一.反射 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力(自省).这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它 ...

  3. flask第二十五篇——控制语句

    有兴趣的请加船长公众号:自动化测试实战 先和大家强调一个发邮件的问题 # coding: utf-8 import smtplib from email.mime.text import MIMETe ...

  4. 第二十五篇:使用 sigaction 函数实现可靠信号

    前言 在前文中,讲述了一个可靠信号的示例.它分成几个步骤组成( 请参考前文 ).在 Linux 系统编程中,有个方法可以将这些步骤给集成起来,让我们使用起来更加的方便. 那就是调用 sigaction ...

  5. SpringBoot非官方教程 | 第二十五篇:2小时学会springboot

    转载请标明出处: http://blog.csdn.net/forezp/article/details/61472783 本文出自方志朋的博客 一.什么是spring boot Takes an o ...

  6. 第二十五篇 jQuery 学习7 获取并设置 CSS 类

    jQuery 学习7 获取并设置 CSS 类   jQuery动态控制页面,那么什么是动态呢?我们就说一下静态,静态几乎又纯html+css完成,就是刷新页面之后,不会再出现什么变动,一个实打实的静态 ...

  7. 第二十五篇 -- C++宝典中的图书管理系统

    此篇文章是基于C++宝典写的图书管理系统,本人对其中的部分做了相应修改,并且以现有格式替代原有格式,使程序更加清晰明了.此程序运行在VS2017上. 系统设计 图书管理系统分为四个模块:图书管理模块. ...

  8. 第二十五篇-Android 应用资源

    这里介绍android的一些资源文件. 以一个登录界面为例. layout.xml <?xml version="1.0" encoding="utf-8" ...

  9. 第二十五篇 hashlib模块(* *)

    用于加密相关的操作,Python 3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法. 加密复杂程度: SHA1  ...

随机推荐

  1. 性能工具之Jmeter小白入门系列之一

    一.简单了解 Apache JMeter The Apache JMeter application is open source software, a 100% pure Java applica ...

  2. 【NX二次开发】Block UI 半径尺寸(沿曲线的位置)

    属性说明 常规         类型 描述     BlockID     String 控件ID     Enable     Logical 是否可操作     Group     Logical ...

  3. 04-拉格朗日对偶问题和KKT条件

    04-拉格朗日对偶问题和KKT条件 目录 一.拉格朗日对偶函数 二.拉格朗日对偶问题 三.强弱对偶的几何解释 四.鞍点解释 4.1 鞍点的基础定义 4.2 极大极小不等式和鞍点性质 五.最优性条件与 ...

  4. 不懂就问」CPU 到底是怎么识别代码的?

    近读到这样一篇文章,从底层硬件角度出发剖析了一下CPU对代码的识别和读取,内容之精彩,读完感觉学到的很多东西瞬间联系起来了,分享给猿们. 首先要开始这个话题要先说一下半导体.啥叫半导体? 半导体其实就 ...

  5. 将Winform和wpf的界面转换为CPF代码用来实现跨平台

    CPF的设计器里带界面代码转换功能,将运行中的Winform或者wpf的程序界面转换为cpf代码,主要转换控件类型和布局,默认支持的是常用的原生控件.不支持Netcore,只支持.Netframewo ...

  6. Golang学习(用代码来学习) - 第一篇

    package main import ( "fmt" "time" "unsafe" ) //示例代码 var isActive bool ...

  7. 快来为你的 .NET 应用加个监控吧!

    导读 CZGL.ProcessMetrics 是一个 Metrics 库,能够将程序的 GC.CPU.内存.机器网络.磁盘空间等信息记录下来,使用 Prometheus 采集信息,然后使用 Grafa ...

  8. 如果给IIS添加防火墙入站配置,支持外部或者局域网访问

    背景简介 也许你试着在本机IIS运行了一些网站,但是奇怪的是,同网络的终端却无法访问你,这时候极有可能被防火墙拦截了,所以我们要找到正确的姿势来开启魔法了. 找到入站规则设置 不管你是Win7还是Wi ...

  9. 22、部署drdb

    22.1.heartbeat部署规划: 本文的实验环境是虚拟机设备: 名称 接口 ip 用途 master-db(主) eth0 10.0.0.16/24 用于服务器之间的数据同步(直连) eth1 ...

  10. QL Server 创建用户时报错:15023 用户,组或角色'XXX'在当前数据库中已存在?

    在使用SQL Server 2000时,我们经常会遇到一个情况:需要把一台服务器上的数据库转移到另外一台服务器上.而转移完成后,需要给一个"登录"关联一个"用户" ...