用QtCore.SIGNAL传递一个参数

时间:2014-01-03 21:20:16

标签: python qt pyqt arguments signals-slots

代码:

class Text(QtGui.QLabel):
    def __init__(self,parent):
        QtGui.QLabel.__init__(self,parent)

    def mouseReleaseEvent(self,evt):
        pos = evt.pos()
        if pos.x() < 0 or pos.y() < 0 or pos.x() > self.width() or pos.y() > self.height():
            return
        self.parent().update()
        self.emit(QtCore.SIGNAL('clicked()'))

    def updateText(self, txt):
        self.setText(txt)

class Window(QtGui.QMainWindow):
    def createNews(self):
        self.a1 = Text(self)
        self.a1.updateText("Test")
        self.a1.setFixedWidth(200)
        self.a1.move(23, 173)
        self.a1.show()
        self.connect(self.a1, QtCore.SIGNAL("clicked()"), self.OpenURL)

    def OpenURL(self, URL):
        QtGui.QDesktopServices.openUrl(QtCore.QUrl(str(URL)))

我正在尝试制作一个“可点击”标签,因此如果我点击它,它将通过self.connect(self.a1, QtCore.SIGNAL("clicked()"), self.OpenURL)打开参数中传递的网址。

问题是,如果可以将参数(url)传递给self.OpenURL(),那么它可以打开URL吗?

1 个答案:

答案 0 :(得分:1)

首先,您应该摆脱旧式信号语法,并定义一个自定义clicked信号,如下所示:

class Text(QtGui.QLabel):
    clicked = QtCore.pyqtSignal()

    def mouseReleaseEvent(self, evt):
        ...
        self.clicked.emit()

然后使用lambda发送带有信号的参数:

    self.a1.clicked.connect(lambda: self.OpenURL(url))

有关新式信号/插槽语法的更多信息,请访问here