在PyQt4 QMessageBox中进行连接无法调用slot方法

时间:2018-07-24 05:54:14

标签: python pyqt pyqt4 qt-signals qmessagebox

我正在尝试分析此处引用的示例代码: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''连接方式(即第一个-我在摘要中已将其注释掉),则永远不会调用slot方法。有人可以帮我这个忙吗?

1 个答案:

答案 0 :(得分:1)

您传递给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