2013-08-05 55 views
0

我有一個QObject,它作爲一個控制器。 此QObject具有對QPushButton的引用。 此QOjbect有一個設置爲在QPushButton的單擊事件時被觸發的方法。QPushButton不會觸發點擊插槽(QObject的方法)

例:

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(..)裝修已經修好了嗎?

謝謝。

回答

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) 
+0

你好!我的代碼庫有點複雜(很多元素),並仔細閱讀你的例子後,我意識到我「打破」了QMainWindow父引用,同時繞着某些類移動。現在它可以工作。非常感謝你!我想QObject引用是不夠的。 – Phil

+0

很高興幫助你:) – Angel

0

可能會嘗試使用released信號而不是clicked信號,因爲點擊的信號是在按鈕被激活時(即,當鼠標光標在按鈕內時被按下然後釋放)發射的。

或者您可以嘗試連接信號的#方法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..." 
+0

我嘗試了老式的連接它們的方式,既用於點擊()和釋放()事件,但仍然無法工作。我真的很困惑。感謝您的幫助。 – Phil