PyQt整合信号为单一s

2024-10-01 13:40:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试减少我必须在我的上下文菜单中使用的信号量。菜单由切换程序操作模式的操作组成,因此由插槽执行的操作非常简单。引用QMenu::trigged上的文档

Normally, you connect each menu action's triggered() signal to its own custom slot, but sometimes you will want to connect several actions to a single slot, for example, when you have a group of closely related actions, such as "left justify", "center", "right justify".

但是,我不知道如何实现这一点,文档也没有进一步详细说明。
假设我在菜单actionMenu中有操作actionOpMode1和{},还有一个插槽setOpMode。我想用一个参数调用setOpMode,该参数与触发的操作有某种关系。我尝试了各种不同的排列方式:

    QObject.connect(self.actionMenu, SIGNAL('triggered(QAction)'), self.setOpMode)  

但我甚至没有让它调用setOpMode,这意味着actionMenu从来没有“感觉被触发”,可以这么说。在

this SO question中,建议使用lamdba来完成,但是:

^{pr2}$

给出"<lambda> () takes exactly 1 argument (0 given)"。我不能说我真的理解这是如何工作的,所以当我从clicked()移动到trigged()时,我可能做错了什么。在

怎么做的?在


Tags: to文档selfyouactions参数connect菜单
3条回答

我使用这种方法:

from functools import partial

def bind(self, action, *params):
    self.connect(action, QtCore.SIGNAL('triggered()'), 
                 partial(action, *params, self.onMenuAction))

def onMenuAction(self, *args):
    pass


bind(self.actionOpMode1, 'action1')
bind(self.actionOpMode2, 'action2')

使用Q对象发送方是一个解决方案,虽然不是最干净的。在

使用QSignalMapper将值与发出信号的对象明确关联。在

您可以使用QObject::sender()来确定哪个QAction发出了信号。在

所以你的插槽可能是这样的:

def triggered(self):
    sender = QtCore.QObject.sender()

    if sender == self.actionOpMode1:
        # do something
    elif sender == self.actionOpMode2:
        # do something else

关于lambda中提到的另一个SO问题,它所做的是创建一个lambda,其中一个参数有一个默认值,所以要将其应用到您的示例中,您需要执行以下操作:

^{pr2}$

然后有一个这样的成员函数:

def changeMode(self, who):
    if who == "mode1":
        # ...
    elif who == "mode2":
        # ...

就我个人而言,第一种方法看起来更干净、更易读。在

相关问题 更多 >