能否在PyQt中调用Windows上下文菜单?
调用Windows系统上下文菜单的实现方案
可以通过PyQt结合pywin32库调用Windows Shell API实现你需要的功能——弹出图中所示的原生Windows上下文菜单,以下是具体实现步骤:
1. 安装依赖
首先安装所需的Python库:
pip install pywin32 pyqt5
2. 代码实现示例
下面的示例在PyQt的列表控件中,右键点击文件/文件夹路径时,弹出对应的系统原生右键菜单:
import sys import win32api import win32gui import win32shell from PyQt5.QtWidgets import QApplication, QListWidget, QWidget, QVBoxLayout from PyQt5.QtCore import Qt, QPoint class FileListWidget(QListWidget): def __init__(self, parent=None): super().__init__(parent) # 添加示例文件/文件夹路径 self.addItem("C:\\Windows\\notepad.exe") self.addItem("C:\\Users") def mousePressEvent(self, event): if event.button() == Qt.RightButton: item = self.itemAt(event.pos()) if item: target_path = item.text() # 弹出系统上下文菜单 self.show_system_context_menu(target_path, event.globalPos()) super().mousePressEvent(event) def show_system_context_menu(self, target_path, global_pos): # 获取当前窗口句柄 hwnd = win32gui.GetForegroundWindow() # 从路径生成Shell PIDL(标识符列表) pidl, _ = win32shell.SHILCreateFromPath(target_path) # 创建Shell文件夹视图对象 shell_view = win32shell.SHCreateShellFolderView(hwnd, pidl) if shell_view: # 转换Qt坐标为Windows系统坐标格式 win_pos = win32api.MAKELONG(global_pos.x(), global_pos.y()) # 显示上下文菜单 shell_view.ShowContextMenu(0, win_pos) class MainWindow(QWidget): def __init__(self): super().__init__() layout = QVBoxLayout() layout.addWidget(FileListWidget()) self.setLayout(layout) self.setWindowTitle("调用Windows系统右键菜单") self.resize(400, 300) if __name__ == "__main__": app = QApplication(sys.argv) window = MainWindow() window.show() sys.exit(app.exec_())
注意事项
- 该方案仅适用于Windows系统,依赖Windows原生Shell API
- 需保证
pywin32版本与你的Python版本兼容,避免出现导入错误 - 无论是文件还是文件夹路径,都能弹出对应的原生右键菜单
内容的提问来源于stack exchange,提问作者Larkov Aleksandr
相关产品推荐
相关产品推荐

