Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么QMenu在调用函数后重新出现_Python_Qt_Pyqt - Fatal编程技术网

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

Python 为什么QMenu在调用函数后重新出现,python,qt,pyqt,Python,Qt,Pyqt,此示例创建一个QListWidget,并启用其项目右键单击。 右键单击将显示QMenu。选择菜单将打开当前用户主目录中的OS文件浏览器。 关闭文件浏览器后,QMenu重新出现,这非常烦人。 如何避免这种不良行为 import sys, subprocess from os.path import expanduser from PyQt4 import QtGui, QtCore class Window(QtGui.QWidget): def __init__(self):

此示例创建一个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_())


我想到了两个想法:

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

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

  • 提示:与使用
    子流程
    打开资源管理器不同,Qt中有一个更好的跨平台解决方案,名为
    QDesktopServices
    ——请参阅


  • 尝试禁用
    窗口
    小部件的上下文菜单。