为什么QMenu在调用函数后重新出现

时间:2014-06-05 16:17:33

标签: python qt pyqt

此示例创建一个QListWidget,其项目右键单击已启用。 右键单击调出QMenu。选择菜单会在当前用户的主目录中打开OS文件浏览器。 文件浏览器关闭后,QMenu重新出现,这非常烦人。 如何避免这种不良行为?

enter image description here

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_())

1 个答案:

答案 0 :(得分:1)

我想到了两个想法:

  1. 在定义self时,尝试添加QMenu()作为构造函数参数,并将QWidget作为父级传递。

  2. self.menu.hide()方法中调用openFolder()

  3. 提示:不是使用subprocess打开资源管理器,而是在Qt中有一个可以说是更好的跨平台解决方案QDesktopServices - 请参阅http://pyqt.sourceforge.net/Docs/PyQt4/qdesktopservices.html