Python中如何在QTableWidget右击菜单点击后使Qt窗口变灰并禁用其他操作

如题,比如我进行“卸载”操作,在这个卸载操作未完成前,整个个 qt 窗口为灰色,点击没有反应。其他操作,比如说“修改”不可用。


Python中如何在QTableWidget右击菜单点击后使Qt窗口变灰并禁用其他操作
3 回复

这个需求是典型的模态对话框行为。在Qt里,你需要创建一个自定义的右键菜单,并在显示菜单时设置应用程序的模态状态。

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QTableWidget, 
                             QTableWidgetItem, QMenu, QAction)
from PyQt5.QtCore import Qt

class MainWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("QTableWidget右键菜单示例")
        self.setGeometry(100, 100, 600, 400)
        
        # 创建表格
        self.table = QTableWidget(5, 3, self)
        self.setCentralWidget(self.table)
        
        # 填充测试数据
        for row in range(5):
            for col in range(3):
                item = QTableWidgetItem(f"行{row+1},列{col+1}")
                self.table.setItem(row, col, item)
        
        # 启用右键菜单
        self.table.setContextMenuPolicy(Qt.CustomContextMenu)
        self.table.customContextMenuRequested.connect(self.show_context_menu)
        
        # 创建右键菜单
        self.context_menu = QMenu(self)
        self.action_copy = QAction("复制", self)
        self.action_paste = QAction("粘贴", self)
        self.action_delete = QAction("删除", self)
        
        self.context_menu.addAction(self.action_copy)
        self.context_menu.addAction(self.action_paste)
        self.context_menu.addSeparator()
        self.context_menu.addAction(self.action_delete)
        
        # 连接菜单动作
        self.action_copy.triggered.connect(self.copy_action)
        self.action_paste.triggered.connect(self.paste_action)
        self.action_delete.triggered.connect(self.delete_action)

    def show_context_menu(self, position):
        # 设置应用程序为模态状态(禁用其他窗口)
        self.setEnabled(False)
        
        # 显示菜单
        self.context_menu.exec_(self.table.viewport().mapToGlobal(position))
        
        # 菜单关闭后恢复非模态状态
        self.setEnabled(True)
    
    def copy_action(self):
        print("执行复制操作")
    
    def paste_action(self):
        print("执行粘贴操作")
    
    def delete_action(self):
        print("执行删除操作")

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec_())

关键点:

  1. 在显示菜单前用self.setEnabled(False)禁用主窗口
  2. 菜单执行完毕后用self.setEnabled(True)恢复
  3. exec_()是阻塞调用,会等待菜单关闭

这样就能实现右键菜单弹出时窗口变灰并禁用其他操作的效果。


1.点击这个按钮给一个信号,窗体连接这个信号
2.在点击的函数里面把窗体所有能点的全部 setEnabled(False)
可以试试,之前搞过一个按钮的禁选

好的 我试下

回到顶部