Qt4,QMenu addAction,用参数连接函数

sal*_*lvo 3 python pyqt pyside qmenu qpushbutton

我会创建一个带有 3 个选项的按钮,当您做出选择时,该按钮会更改其文本。

这个解决方案对我有用:

def swTrigger(self):
    self.setTrigger(self.ui.triggerButton,'Software')
def hwTrigger(self):
    self.setTrigger(self.ui.triggerButton,'Hardware')
def bothTrigger(self):
    self.setTrigger(self.ui.triggerButton,'Both')

def setTrigger(self,pushButton,value):
    pushButton.setText(value)
    #other actions

def uiConfig(self):     
    ##triggerbutton configuration 
    menu = QtGui.QMenu()
    menu.addAction('Software',self.swTrigger)
    menu.addAction('Hardware',self.hwTrigger)        
    menu.addAction('Both', self.bothTrigger)
    self.ui.triggerButton.setText("Software")   
    self.ui.triggerButton.setMenu(menu)
Run Code Online (Sandbox Code Playgroud)

但是我想避免为每个菜单项制作一个方法,因为我想制作动态菜单条目。

有一个更好的方法吗?

Vik*_*kez 6

您可以将任一partial函数或匿名函数与仅一个参数化函数结合使用来完成所有任务。示例中显示了两个版本(使用partiallambda):

from functools import partial

def setTrigger(self, pushButton,value):
    pushButton.setText(value)
    #other actions

def uiConfig(self):     
    ##triggerbutton configuration 
    self.ui.triggerButton.setText("Software")
    self.ui.triggerButton.setMenu(menu)

    menu = QtGui.QMenu()
    menu.addAction('Software', partial(self.setTrigger, self.ui.triggerButton, 'Software'))
    menu.addAction('Hardware', lambda: self.setTrigger(self.ui.triggerButton, 'Hardware'))
Run Code Online (Sandbox Code Playgroud)