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_())
关键点:
- 在显示菜单前用
self.setEnabled(False)禁用主窗口 - 菜单执行完毕后用
self.setEnabled(True)恢复 exec_()是阻塞调用,会等待菜单关闭
这样就能实现右键菜单弹出时窗口变灰并禁用其他操作的效果。
1.点击这个按钮给一个信号,窗体连接这个信号
2.在点击的函数里面把窗体所有能点的全部 setEnabled(False)
可以试试,之前搞过一个按钮的禁选
好的 我试下

