2013-02-08 2 views
1

Главное окно объявлено в Class1. Я пытаюсь создать объект класса 2, создать виджет (кнопку) и подключить его к слоту.слоты в классе, где главное окно не было объявлено

import sys 
from PyQt4 import QtGui,QtCore 

class Class2(object): 
    def __init__(self,parent): 
     return 
    def button(self,parent): 
     self.print_button=QtGui.QPushButton("print hello",parent) 
     self.print_button.show() 
     self.print_button.clicked.connect(self.print_hello) 

    def print_hello(self,parent): 
     print 'hello' 



class Class1(QtGui.QMainWindow): 
    def __init__(self): 
     super(Class1, self).__init__() 
     self.welcomeScreen() 

    def welcomeScreen(self): 
     obj=Class2(self) 
     obj.button(self) 


def main(): 
    app = QtGui.QApplication(sys.argv) 
    mw = Class1() 
    mw.show() 
    sys.exit(app.exec_()) 


if __name__=='__main__': 
    main() 

Теперь кнопка создается, но слот не работает. Как справиться с этой проблемой?

ответ

0

Ваш print_hello принимает 2 аргумента, и вы передаете их только одному.

Попробуйте это:

self.print_button.clicked.connect(lambda: self.print_hello(self)) 
+0

я не понимаю лямбда ?? почему он не работает без лямбды? – fecub

+1

, потому что вам нужно передать указатель на функцию, которая возвращается лямбдой. Без lambda 'self.print_hello (self)' будет возвращать 'None', и, следовательно,' None' будет передан как указатель функции, поэтому слот не будет работать. Лямбда - отличный инструмент. Он создает новую функцию «anonymoys», которая выполняет то, что мы определяем, и возвращает указатель на нее. В этом примере выполняется 'self.print_hello (self)'. Без лямбда мы не можем передавать аргументы указателю. –

+0

ах, я это понимаю! большое спасибо! – fecub