thecreator232
thecreator232

Reputation: 2185

How to connect two classes using PyQt Signal Slot?

i'm writing an application in python using twisted and PyQt. What i'm trying to do is that when a client registers , it is reflected in the front end. So when the server registers the client it emit's an signal which will be trapped and a slot will be triggered but , it doesn't seem to work. Both of the signal slot in the code are not functioning.

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()

Upvotes: 1

Views: 2346

Answers (1)

Aleksandar
Aleksandar

Reputation: 3661

here is how I connected two classes, I dont know is that the best way, but it works as I wanted:

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) 

so, important is last row, where I've emitted signal from MyPushButton class (self) to MyForm class (__mForm) , and doSomething() is called. But as you can see in this line: button = MyPushButton(i, self), I have passed self (MyForm) to MyPushButton.

I hope this will help you somehow.

Upvotes: 1

Related Questions