【问题标题】:Converting from PyQt4 signal to PyQt5 signal doesn't work从 PyQt4 信号转换为 PyQt5 信号不起作用
【发布时间】:2015-03-28 20:50:41
【问题描述】:

我正在尝试将游戏从 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)

【问题讨论】:

    标签: python-2.7 pyqt4 signals-slots pyqt5


    【解决方案1】:

    这是一个众所周知的“陷阱”。

    有一些信号(如clicked 和triggered)具有始终发送值的默认参数。对于按钮和操作,这是一个bool,表示它们当前的检查状态(即使它们可能尚未设置为可检查)。

    要解决此问题,您可以像这样连接信号:

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

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

    【讨论】:

    • 首先...有效!!!非常感谢!其次,我不确定我是否完全理解这一点。您正在向 lambda 函数“传递”一个元组?那么为什么只有一个变量到达那里?我喜欢 QButtonGroup 的想法,但由于这是一个介绍类,它们是在 Designer 中构建的,而我在 Designer 中看不到那个... :-(
    • @Arana。它不是一个元组。有两个参数:第一个接受信号发送的值,第二个接受你的默认值。第一个论点就被扔掉了。您可以通过选择按钮在 Qt Designer 中创建按钮组,然后在右键菜单中选择“分配给按钮组”(至少必须选择两个按钮)。
    • 知道了! ! (在这里插入涂料!)谢谢,这是你救了我的培根的两倍!我想我忽略了介于两者之间的 lambda 函数!我欠你一杯虚拟啤酒!给我两个! :-D
    猜你喜欢
    • 2018-02-24
    • 2016-05-13
    • 2017-09-25
    • 1970-01-01
    • 1970-01-01
    • 2021-04-21
    • 2023-01-23
    • 2021-05-12
    • 2023-03-17
    相关资源
    最近更新 更多