PyQT5 (四十九) 在 QTableWidget 表格中实现右键快捷菜单 的案例

 

在 QTableWidget 表格中实现右键快捷菜单 的案例
1.如何弹出菜单
2.如何在满足条件的情况下弹出菜单

QMenu.exec_

import sys

from PyQt5.QtCore import Qt
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QApplication, QWidget, QTableWidget, QTableWidgetItem, QMenu, QVBoxLayout

'''
在 QTableWidget 表格中实现右键快捷菜单 的案例
1.如何弹出菜单
2.如何在满足条件的情况下弹出菜单

QMenu.exec_

'''

class twContextDemo(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        # 设置定位和左上角坐标
        self.setGeometry(300, 300, 460, 360)
        # 设置窗口标题
        self.setWindowTitle('QTableWidget扩展表格显示上下文菜单 的演示')
        # 设置窗口图标
        # self.setWindowIcon(QIcon('../web.ico'))

        layout = QVBoxLayout()
        self.tablewidget = QTableWidget()
        self.tablewidget.setRowCount(3)
        self.tablewidget.setColumnCount(3)

        layout.addWidget(self.tablewidget)
        self.tablewidget.setHorizontalHeaderLabels(['姓名','性别','体重(kg)'])

        newItem = QTableWidgetItem('美国队长')
        self.tablewidget.setItem(0,0,newItem)

        newItem = QTableWidgetItem('男')
        self.tablewidget.setItem(0,1,newItem)

        newItem = QTableWidgetItem('180')
        self.tablewidget.setItem(0,2,newItem)

        newItem = QTableWidgetItem('拿破仑')
        self.tablewidget.setItem(1,0,newItem)

        newItem = QTableWidgetItem('女')
        self.tablewidget.setItem(1,1,newItem)

        newItem = QTableWidgetItem('150')
        self.tablewidget.setItem(1,2,newItem)

        # 允许打开上下文菜单
        self.tablewidget.setContextMenuPolicy(Qt.CustomContextMenu)
        # 绑定事件
        self.tablewidget.customContextMenuRequested.connect(self.generateMenu)

        self.setLayout(layout)

    def generateMenu(self,pos):
        print(pos)

        # 获取点击行号
        for i in self.tablewidget.selectionModel().selection().indexes():
            rowNum = i.row()
        # 如果选择的行索引小于2,弹出上下文菜单
        if rowNum < 2:
            menu = QMenu()
            item1 = menu.addAction("复制")
            item2 = menu.addAction("剪切")
            item3 = menu.addAction("粘贴")
            item4 = menu.addAction("添加一行")
            item5 = menu.addAction("删除")
            item6 = menu.addAction("修改")

            # 转换坐标系
            screenPos = self.tablewidget.mapToGlobal(pos)
            print(screenPos)

            # 被阻塞
            action = menu.exec(screenPos)
            if action == item1:
                print('选择了第1个菜单项',self.tablewidget.item(rowNum,0).text()
                      ,self.tablewidget.item(rowNum,1).text()
                      ,self.tablewidget.item(rowNum,2).text())
            elif action == item2:
                print('选择了第2个菜单项',self.tablewidget.item(rowNum,0).text()
                      ,self.tablewidget.item(rowNum,1).text()
                      ,self.tablewidget.item(rowNum,2).text())
            elif action == item3:
                print('选择了第3个菜单项',self.tablewidget.item(rowNum,0).text()
                      ,self.tablewidget.item(rowNum,1).text()
                      ,self.tablewidget.item(rowNum,2).text())
            elif action == item4:
                print('选择了第4个菜单项',self.tablewidget.item(rowNum,0).text()
                      ,self.tablewidget.item(rowNum,1).text()
                      ,self.tablewidget.item(rowNum,2).text())
            else:
                return



if __name__ == '__main__':
    app = QApplication(sys.argv)
    # 设置应用图标
    app.setWindowIcon(QIcon('../web.ico'))
    w = twContextDemo()
    w.show()
    sys.exit(app.exec_())

  • 7
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
要在QTableWidget实现右键菜单功能,可以使用QMenu和contextMenuEvent()事件。具体实现步骤如下: 1.创建QMenu对象并添加菜单项。 ```python menu = QMenu(self) menu.addAction("Copy") menu.addAction("Paste") ``` 2.在QTableWidget的contextMenuEvent()事件,设置菜单的位置,并显示菜单。 ```python def contextMenuEvent(self, event): menu = QMenu(self) menu.addAction("Copy") menu.addAction("Paste") if self.itemAt(event.pos()): menu.exec_(event.globalPos()) ``` 完整代码如下: ```python from PyQt5.QtWidgets import QApplication, QMainWindow, QTableWidget, QTableWidgetItem, QMenu from PyQt5.QtCore import Qt class MainWindow(QMainWindow): def __init__(self): super().__init__() self.table = QTableWidget(self) self.table.setRowCount(4) self.table.setColumnCount(2) self.table.setHorizontalHeaderLabels(["Name", "Age"]) self.table.setItem(0, 0, QTableWidgetItem("Tom")) self.table.setItem(0, 1, QTableWidgetItem("20")) self.table.setItem(1, 0, QTableWidgetItem("Jerry")) self.table.setItem(1, 1, QTableWidgetItem("18")) self.table.setItem(2, 0, QTableWidgetItem("Lucy")) self.table.setItem(2, 1, QTableWidgetItem("22")) self.table.setItem(3, 0, QTableWidgetItem("John")) self.table.setItem(3, 1, QTableWidgetItem("25")) self.setCentralWidget(self.table) def contextMenuEvent(self, event): menu = QMenu(self) menu.addAction("Copy") menu.addAction("Paste") if self.table.itemAt(event.pos()): menu.exec_(event.globalPos()) if __name__ == "__main__": app = QApplication([]) window = MainWindow() window.show() app.exec_() ``` 这样就可以在QTableWidget实现右键菜单功能了。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值