2013-07-03 3 views
1

Я пишу приложение в python с помощью twisted и PyQt. То, что я пытаюсь сделать, это то, что когда клиент регистрируется, он отражается в интерфейсе. Поэтому, когда сервер регистрирует клиент, он излучает сигнал, который будет захвачен, и слот будет запущен, но, похоже, он не работает. Оба слота сигнала в коде не работают.Как подключить два класса с помощью PyQt Signal Slot?

from PyQt4 import QtGui, QtCore 
import sys 
from twisted.internet.protocol import Factory, Protocol 
from twisted.protocols import amp 
import qt4reactor 

class register_procedure(amp.Command): 
    arguments = [('MAC',amp.String()), 
          ('IP',amp.String()), 
          ('Computer_Name',amp.String()), 
          ('OS',amp.String()) 
          ] 
    response = [('req_status', amp.String()), 
      ('ALIGN_FUNCTION', amp.String()), 
          ('ALIGN_Confirmation', amp.Integer()), 
          ('Callback_offset',amp.Integer()) 
          ] 

class Ui_MainWindow(QtGui.QMainWindow): 

    def __init__(self,reactor, parent=None): 
     super(Ui_MainWindow,self).__init__(parent) 
     self.reactor=reactor 
     self.pf = Factory() 
     self.pf.protocol = Protocol 
     self.reactor.listenTCP(3610, self.pf) # listen on port 1234 

    def setupUi(self,MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(903, 677) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) 
     sizePolicy.setHorizontalStretch(0) 
     sizePolicy.setVerticalStretch(0) 
     sizePolicy.setHeightForWidth(self.centralwidget.sizePolicy().hasHeightForWidth()) 
     self.centralwidget.setSizePolicy(sizePolicy) 

     self.create_item() 


     self.retranslateUi(MainWindow) 
     self.connect(self, QtCore.SIGNAL('triggered()'), self.closeEvent) 
     QtCore.QObject.connect(self,QtCore.SIGNAL('registered()'),self.registered) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     self.pushButton_4.setText(_translate("MainWindow", "Delete System ", None)) 
     self.pushButton.setText(_translate("MainWindow", "Add System", None)) 
     self.label_2.setText(_translate("MainWindow", "SYSTEM STATUS", None)) 
     self.label.setText(_translate("MainWindow", "Monitoring Output", None)) 


    def registered(self):# this function is not being triggered 
     print "check" 
     self.textbrowser.append() 

    def closeEvent(self, event):#neither is this being triggered 
     print "asdf" 
     self.rector.stop() 
     MainWindow.close() 
     event.accept() 

class bridge(QtCore.QObject): 
    mySignal = QtCore.SIGNAL('mySignal(QString)') 
    def __init__(self): 
     QtCore.QObject.__init__(self) 
    def registered(self): 
     print "p op" 
     QtCore.QObject.emit(self, QtCore.SIGNAL('registered')) 


class Protocol(amp.AMP): 
    @register_procedure.responder 
    def register_procedure(self,MAC,IP,Computer_Name,OS): 
     self.bridge_conn=bridge() 
     cursor_device.execute("""select * FROM devices where MAC = ?;""",[(MAC)]) 
     exists_val=cursor_device.fetchone() 
     cursor_device.fetchone() 
     print "register" 
     if not exists_val== "": 
      cursor_device.execute("""update devices set IP= ? , Computer_name= ? , OS = ? where MAC= ?;""",[IP,Computer_Name,OS,MAC]) 
      self.bridge_conn.registered() # <--emits signal 
      return {'req_status': "done" ,'ALIGN_FUNCTION':'none','ALIGN_Confirmation':0,'Callback_offset':call_offset(1)} 
     else: 
      cursor_device.execute("""INSERT INTO devices(Mac,Ip,Computer_name,Os) values (?,?,?,?);""",[MAC,IP,Computer_Name,OS]) 
      self.bridge_conn.registered()#<--emits signal 
      return {'req_status': "done" ,'ALIGN_FUNCTION':'main_loop()','ALIGN_Confirmation':0,'Callback_offset':0} 



if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 

    try: 
     import qt4reactor 
    except ImportError: 
     from twisted.internet import qt4reactor 
    qt4reactor.install() 

    from twisted.internet import reactor 
    MainWindow = QtGui.QMainWindow() # <-- Instantiate QMainWindow object. 
    ui = Ui_MainWindow(reactor) 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    reactor.run() 
+0

Возможный дубликат [как испустить сигнал из класса не PyQt?] (Http://stackoverflow.com/questions/17461229/how-to-emit-signal-from-a-non-pyqt-class) – numentar

+0

@ardoi: Да, я тоже написал это – TheCreator232

ответ

1

вот как я соединил два класса, я не знаю, что самый лучший способ, но он работает, как я хотел:

class MyForm(QtGui.QMainWindow): 
    def __init__(self): 
     .... 
     self.connect(self, QtCore.SIGNAL("mySignal(PyQt_PyObject)"), self.doSomething) 
    .... 
    def someMethod(self): 
     ... 
     button = MyPushButton(i, self) 
     ... 
    def doSomething(self): 
     ... 

class MyPushButton(QtGui.QPushButton): 
    def __init__(self, elementID, mForm): 
     super(MyPushButton, self).__init__() 
     self.__elementID = elementID 
     self.__mForm = mForm 
     self.connect(self, QtCore.SIGNAL('clicked()'), self,  QtCore.SLOT("triggerOutput()")) 

    @QtCore.pyqtSlot() 
    def triggerOutput(self): 
     self.__mForm.emit(QtCore.SIGNAL("mySignal(PyQt_PyObject)"), self.__elementID) 

так, важно это последняя строка, где я испускаемый сигнал из класса MyPushButton (self) в класс MyForm (__mForm) и вызывается doSomething(). Но как вы можете видеть в этой строке: button = MyPushButton(i, self), я передал себя (MyForm) в MyPushButton.

Я надеюсь, что это как-то поможет.

Смежные вопросы