【问题标题】:Unable to send signal from Button created in Python loop无法从 Python 循环中创建的按钮发送信号
【发布时间】:2017-03-11 15:07:32
【问题描述】:

我正在尝试在循环中创建一系列按钮。每个按钮都会获得一个 ID 号,因为它是文本,当单击该按钮时,它应该将 ID 号发送到将打开存档订单的函数。这时候我只想打印订单号来证明信号有效,每个按钮都连接到了正确的订单号。

ui.cmdOpen = QtWidgets.QPushButton(ui.frOrdHist)
ui.cmdOpen.setGeometry(QtCore.QRect(269, line1Y, 61, 22))
ui.cmdOpen.setText(iOrderId)
ui.cmdOpen.setObjectName("cmdOpen")
ui.cmdOpen.clicked.connect(lambda button=ui.cmdOpen:displayOrder(ui, button))


def displayOrder(ui, button):
    i = button.text()
    print(i)

单击按钮时,我收到一条错误消息,提示“布尔对象没有文本属性”

我尝试直接传递订单号,它会打印“False”,所以仍然是一个布尔值。我不知道布尔值是从哪里来的,一定是信号有问题。

【问题讨论】:

标签: python pyqt5


【解决方案1】:

clicked signal 总是发送按钮的 checked 状态。因此,这将使用布尔值覆盖您的默认 button 参数,这就是您获得 AttributeError 的原因(即因为 bool 没有该方法)。您应该像这样进行连接:

ui.cmdOpen.clicked.connect(
    lambda checked, button=ui.cmdOpen: displayOrder(ui, button))

PS:这个问题的另一个常见来源是 QAction 的triggered signal。如果您发现您的插槽接收到意外输入,则始终值得检查 Qt 文档以查看信号的签名是否具有任何具有默认值的参数 - 即看起来像这样:

void QSomeClass::someSignal(bool param = false)

【讨论】:

    猜你喜欢
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多