PySide无法连接信号clicked()

时间:2014-12-11 13:05:49

标签: python pyside

我有一个应用程序,应该在按下按钮后打开Web浏览器地址。主要功能如下:

class MainWindow(QtGui.QDialog):
    def __init__( self, parent = None ):
        super( MainWindow, self ).__init__( parent = parent )
        self.button_layout = QtGui.QHBoxLayout(self)
        self.webButton = PicButton(QtGui.QPixmap("images/button.png"))
        self.filmButton.clicked.connect(openWebpage("http://some.web.adress"))
        self.button_layout.addWidget(self.webButton)

打开网络浏览器的功能就是这样:

def openWebpage(address):
    try:
        import webbrowser

        webbrowser.open(address)

    except ImportError as exc:
        sys.stderr.write("Error: failed to import settings module ({})".format(exc))

运行此代码后,没有可见的应用程序窗口,Web浏览器立即触发,控制台返回:

Failed to connect signal clicked().

连接到此按钮的简单功能正常工作(例如 - 将文本打印到控制台)。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

要在插槽中传递参数,您需要构造一个lambda表达式:

self.filmButton.clicked.connect(lambda: openWebpage("http://some.web.adress"))

为了解释这一点,connect()方法接受一个可调用对象作为其参数。 lambda表达式基本上是一个匿名函数,就是一个这样的可调用对象。您还可以在functools模块的partial()方法中包装函数调用以实现相同的功能。有关Python可调用内容的更多信息,请参阅What is a "callable" in Python?

答案 1 :(得分:0)

正如人们早些时候所说的那样 - 使用lambda,或者使用普通的slot,这给了(至少对我来说)更多的可读性。

def __init__(self):
    self.filmButton.clicked.connect(self._film_button_clicked)

@pyqtSlot() # note that this is not really necessary
def _film_button_clicked(self):
    self.openWebpage('http://some.web.adress')