PySide界面问题:listWidget中添加右键菜单

问题描述:

解决右键菜单是在鼠标按下时显示,而不是鼠标释放时显示菜单


解决过程:

方案一:

使用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()

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值