2013-07-03 45 views
1

我正在寫一個應用程序在Python中使用扭曲和PyQt。我想要做的是,當客戶端註冊時,它會反映在前端。所以當服務器註冊客戶端時,它會發出一個信號,這個信號將會被捕獲,並且一個插槽會被觸發,但它似乎不起作用。代碼中的兩個信號插槽都不起作用。如何使用PyQt信號插槽連接兩個類?

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。

我希望這會幫助你莫名其妙。