0

我有一个 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(..)装饰不应该修复它吗?

谢谢你。

4

2 回答 2

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)
于 2013-08-06T02:51:40.183 回答
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..."
于 2013-08-05T12:11:41.627 回答