Python 2.7 从PyQt4信号转换为PyQt5信号不需要';行不通

Python 2.7 从PyQt4信号转换为PyQt5信号不需要';行不通,python-2.7,pyqt4,signals-slots,pyqt5,Python 2.7,Pyqt4,Signals Slots,Pyqt5,我正在尝试将一个游戏从PyQt4转换为PyQt5,但在转换为新的信号类型时遇到了一些困难。所以我回到了原来的状态,我尝试先用PyQt4转换信号。注释行是旧(工作)版本,下面是新版本。但是,“新”版本总是将相同的值传递给事件处理程序:0。我尝试过许多微妙的不同版本,但似乎没有任何效果。想法 self.cellButtonNames = [self.ui.cell0Button, self.ui.cell1Button, self.ui.cell2Button, self.ui.cel

我正在尝试将一个游戏从PyQt4转换为PyQt5,但在转换为新的信号类型时遇到了一些困难。所以我回到了原来的状态,我尝试先用PyQt4转换信号。注释行是旧(工作)版本,下面是新版本。但是,“新”版本总是将相同的值传递给事件处理程序:0。我尝试过许多微妙的不同版本,但似乎没有任何效果。想法

    self.cellButtonNames = [self.ui.cell0Button,  self.ui.cell1Button,  self.ui.cell2Button,  self.ui.cell3Button,  self.ui.cell4Button,  self.ui.cell5Button,
                                        self.ui.cell6Button, self.ui.cell7Button,  self.ui.cell8Button,  self.ui.cell9Button,  self.ui.cell10Button,  self.ui.cell11Button, 
                                        self.ui.cell12Button,  self.ui.cell13Button,  self.ui.cell14Button,  self.ui.cell15Button,  self.ui.cell16Button,  self.ui.cell17Button, 
                                        ...,
                                        self.ui.cell126Button,  self.ui.cell127Button,  self.ui.cell128Button,  self.ui.cell129Button,  self.ui.cell130Button,  self.ui.cell131Button,
                                        self.ui.cell132Button,  self.ui.cell133Button,  self.ui.cell134Button,  self.ui.cell135Button,  self.ui.cell136Button,  self.ui.cell137Button,
                                        self.ui.cell138Button,  self.ui.cell139Button,  self.ui.cell140Button,  self.ui.cell141Button,  self.ui.cell142Button,  self.ui.cell143Button]

    # This will connect all of the ball buttons to one slot (Event Handler) and pass the cell number to that event handler when signalled.
    # This elimates the need for 144 event handling methods! :-)

    cellNumber = 0
    for buttonName in self.cellButtonNames:
        # self.connect(buttonName, QtCore.SIGNAL("clicked()"), lambda who=cellNumber: self.ballClicked(who))
        buttonName.clicked.connect(lambda who=cellNumber: self.ballClicked(who))
        cellNumber += 1

@QtCore.pyqtSignature("")                                                                           # otherefore only want ne signal for this autoconnect.
def ballClicked ( self, cellNumber):
    print("Ball %i clicked" % cellNumber)

这是一个非常有名的“抓住你了”

有一些信号(如单击的<代码>和触发的<代码>等)具有始终发送值的默认参数。对于按钮和动作,这是一个
bool
,表示它们的当前选中状态(即使它们可能未设置为可检查)

要解决此问题,您可以如下方式连接信号:

    buttonName.clicked.connect(
        lambda checked, who=cellNumber: self.ballClicked(who))

但是,在这个特定的情况下,您可能也想考虑使用A。这只需要一个信号连接,而且,作为一个附带的好处,您还可以获得一个现成的界面来管理按钮。

首先。。。它工作!!!谢谢!第二,我不确定我是否完全理解这一点。您正在向lambda函数“传递”元组?那么,为什么只有一个变量到达那里?我喜欢QButtonGroup的想法,但因为这是一个介绍类,它们是在Designer中构建的,我在Designer中没有看到这个…:-(@Arana。它不是元组。有两个参数:第一个参数接受信号发送的值,第二个参数有您的默认值。第一个参数刚刚被丢弃。您可以在Qt Designer中创建按钮组,方法是选择按钮,然后在右击菜单中选择“分配给按钮组”(至少必须选择两个按钮)。明白了!!(在此处插入“dope slap!)谢谢,这是你两次保存我的培根!我想我忽略了其间的lambda函数!我欠你一杯虚拟啤酒!我身上有两杯!:-D