此示例创建一个QListWidget,其项目右键单击已启用。 右键单击调出QMenu。选择菜单会在当前用户的主目录中打开OS文件浏览器。 文件浏览器关闭后,QMenu重新出现,这非常烦人。 如何避免这种不良行为?
import sys, subprocess
from os.path import expanduser
from PyQt4 import QtGui, QtCore
class Window(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
layout = QtGui.QVBoxLayout(self)
self.listWidget = QtGui.QListWidget()
self.listWidget.addItems(('One','Two','Three','Four','Five'))
self.listWidget.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
self.listWidget.connect(self.listWidget,QtCore.SIGNAL('customContextMenuRequested(QPoint)'),self.showMenu)
self.menu=QtGui.QMenu()
menuItem=self.menu.addAction('Open Folder')
self.connect(menuItem,QtCore.SIGNAL('triggered()'),self.openFolder)
layout.addWidget(self.listWidget)
def showMenu(self, QPos):
parentPosition=self.listWidget.mapToGlobal(QtCore.QPoint(0, 0))
menuPosition=parentPosition+QPos
self.menu.move(menuPosition)
self.menu.show()
def openFolder(self):
if sys.platform.startswith('darwin'):
subprocess.call(['open', '-R',expanduser('~')])
if sys.platform.startswith('win'):
subprocess.call(['explorer','"%s"'%expanduser('~')])
if __name__ == '__main__':
import sys
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
答案 0 :(得分:1)
我想到了两个想法:
在定义self
时,尝试添加QMenu()
作为构造函数参数,并将QWidget
作为父级传递。
在self.menu.hide()
方法中调用openFolder()
。
提示:不是使用subprocess
打开资源管理器,而是在Qt中有一个可以说是更好的跨平台解决方案QDesktopServices
- 请参阅http://pyqt.sourceforge.net/Docs/PyQt4/qdesktopservices.html