QPushButton不会触发点击的插槽(QObject的方法)

时间:2013-08-05 11:39:21

标签: qt python-2.7 qt4 pyqt pyside

我有一个QObject,它作为一个控制器。 此QObject引用了QPushButton。 此QOjbect有一个方法设置为在QPushButton的点击事件上触发。

例如:

class MyController(QObject):
    def __init__(self, parent=None):
        super(MyController, self).__init__(parent)

        self.some_ref = ....

        self.button = self.some_ref.button (returns QPushButton)
        self.button.clicked.connect(self.button_clicked)

    # @Slot(type)
    def button_clicked(self):
        print 'button clicked: ', self.sender()
        # print 'button clicked (no sender req.)

这里,button_clicked不会被触发。 我尝试使用@Slot()@Slot(QObject)@Slot(type)@Slot(str)@Slot(int)对其进行修饰,但仍无效。

我做错了什么?

如果我使用..clicked.connect(lambda: self.button_clicked),它当然有效。所以我认为这是一种类型不匹配,但@Slot(..)装饰不应该修复它吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

我不知道问题是@Slot()是否被注释(开头有#),但这段代码适用于我(它在python 3中,但只是更改打印行)

import sys
from PySide.QtGui import *
from PySide.QtCore import *

class Window(QMainWindow):
    def __init__(self, parent=None):
        super(Window, self).__init__(parent)
        self.button = QPushButton()
        self.button.setText("Test")
        self.setCentralWidget(self.button)

    def GetButton(self):
        return self.button


class MyController(QObject):
    def __init__(self, parent=None):
        super(MyController, self).__init__(parent)

        self.button = parent.GetButton() #(returns QPushButton)
        self.button.clicked.connect(self.button_clicked)

    @Slot()
    def button_clicked(self):
        print('button clicked: ', self.sender())

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = Window()
    controller = MyController(window)
    window.show()
    app.exec_()
    sys.exit(0)

答案 1 :(得分:0)

可能可以尝试released信号而不是clicked信号,因为点击的信号在按钮被激活时发出(即按下然后在鼠标光标位于按钮内时释放)

或者您可以尝试连接信号的#method 2。

class MyController(QObject):
    def __init__(self, parent=None):
        super(MyController, self).__init__(parent)

        self.some_ref = ....

        self.button = self.some_ref.button
        # method 1
        self.button.released.connect(self.button_clicked)
        # method 2
        self.connect(self.button, SIGNAL('released()'), self.button_clicked)


    def button_clicked(self):
        print "yipee it works..."