PyQt4中连接QMessageBox调用slot方法失败

Connecting in PyQt4 QMessageBox fails to call the slot method

我试图分析此处引用的示例代码:PyQt - QMessageBox 这是片段:

from PyQt4.QtGui import *
from PyQt4.QtCore import *


class Window(QMainWindow):
    def __init__(self):
        super().__init__()

        w = QWidget()
        b = QPushButton(self)
        b.setText("Show message!")

        b.clicked.connect(self.showdialog)
        w.setWindowTitle("PyQt Dialog demo")

    def showdialog(self):
        msg = QMessageBox()
        msg.setIcon(QMessageBox.Question)


        # self.connect(msg, SIGNAL('clicked()'), self.msgbtn)
        msg.buttonClicked.connect(self.msgbtn)

        msg.exec_()

    def msgbtn(self, i):
        print("Button pressed is:", i.text())



if __name__ == '__main__':
    app = QApplication([])
    w = Window()
    w.show()
    app.exec_()

在 PyQt 中有两种方法可以将信号连接到槽。对于按钮,它是:

QtCore.QObject.connect(button, QtCore.SIGNAL(“clicked()”), slot_function)

widget.clicked.connect(slot_function)

以第二种方式使用它效果很好:msgbtn 插槽方法按预期调用。但是,如果我尝试将其更改为更常见的 'PyQt-onic' 连接方式(即第一种 - 我在代码片段中将其注释掉),则永远不会调用插槽方法。谁能帮我解决这个问题?

您传递给 SIGNAL 的信号不正确,QMessageBox 没有点击信号但信号是 buttonClicked (QAbstractButton *) 所以正确的是:

self.connect(msg, SIGNAL("buttonClicked(QAbstractButton *)"), self.msgbtn)

另一方面这不是PyQt-onic风格,而是不推荐使用的旧风格,但我们建议使用新风格。

旧样式:

self.connect(msg, SIGNAL("buttonClicked(QAbstractButton *)"), self.msgbtn)

新款式:

msg.buttonClicked.connect(self.msgbtn)

有关详细信息,请阅读 docs