我正在尝试分析此处引用的示例代码: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方法。有人可以帮我这个忙吗?
答案 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。