问题描述:
解决右键菜单是在鼠标按下时显示,而不是鼠标释放时显示菜单
解决过程:
方案一:
使用pyside自带的右键菜单方式,是在鼠标释放时显示菜单
self.listwidget.setContextMenuPolicy(Qt.CustomContextMenu)
self.listwidget.customContextMenuRequested[QPoint].connect(self.right_widget_menu)
def right_widget_menu(self, point):
popMenu = QMenu()
popMenu.addAction(QAction(u'添加', self, triggered=self.add))
popMenu.addAction(QAction(u'删除', self, triggered=self.remove))
popMenu.exec_(QCursor.pos())
方案二:
使用自定义listWidget的方法,可以实现鼠标按下时显示右键菜单,但是其他的鼠标事件需要重写
#-*-coding:utf-8-*-
from maya import cmds
from maya import mel
from maya import OpenMayaUI as omui
from PySide2.QtCore import *
from PySide2.QtGui import *
from PySide2.QtWidgets import *
from PySide2.QtUiTools import *
class MyListWidget(QListWidget):
def __init__(self, parent=None):
super(MyListWidget, self).__init__(parent)
self.popMenu = QMenu()
self.actionA = self.popMenu.addAction(u'添加')
self.actionB = self.popMenu.addAction(u'删除')
def mousePressEvent(self, event):
if event.buttons() == Qt.RightButton:
self.popMenu.exec_(QCursor.pos())
event.accept()
else:
pos = QCursor.pos()-self.mapToGlobal(QPoint(0, 0))
item = self.indexAt(pos)
self.setCurrentRow(item.row())
pass
def mouseReleaseEvent(self, event):
if event.button() == Qt.LeftButton:
event.accept()
from shiboken2 import wrapInstance
import os.path
mayaMainWindowPtr = omui.MQtUtil.mainWindow()
mayaMainWindow = wrapInstance(long(mayaMainWindowPtr), QWidget) #获得Maya主窗口
class CreateUI(QWidget):
def __init__(self, *args, **kwargs):
super(CreateUI, self).__init__(*args, **kwargs)
self.setParent(mayaMainWindow)#将新窗口设置为maya的子级
self.setWindowFlags(Qt.Window)
self.initUI()
def initUI(self):
self.listWidget = QMyListWidget() #使用自定义的listWidge
self.listWidget .actionA.triggered.connect(self.add)
self.listWidget .actionB.triggered.connect(self.remove)
def main():
ui = CreateUI()
ui.show()
print 'run MyFirstQt'
return ui
if __name__ == '__main__':
main()
最终方案:
使用事件过滤器;使用自带的QlistWidget,写一个事件过滤的函数,只修改鼠标按下的事件
class CreateUI(QWidget):
def __init__(self, *args, **kwargs):
super(CreateUI, self).__init__(*args, **kwargs)
self.setParent(mayaMainWindow)#将新窗口设置为maya的子级
self.setWindowFlags(Qt.Window)
self.initUI()
def initUI(self):
self.listWidget = QListWidget()
self.listWidget.viewport().installEventFilter(self) # 安装事件过滤器
def eventFilter(self, obj, event):
if obj == self.listWidget.viewport():
if event.type() == QEvent.MouseButtonPress:
if event.buttons() == Qt.RightButton:
self.left_widget_menu(QCursor.pos())
def main():
ui = CreateUI()
ui.show()
print 'run MyFirstQt'
return ui
if __name__ == '__main__':
main()