如何使用PyQt Signal Slot连接两个类?

时间:2013-07-03 15:06:51

标签: python python-2.7 pyqt pyqt4 twisted

我正在使用twisted和PyQt在python中编写应用程序。我想要做的是,当客户端注册时,它会反映在前端。因此,当服务器注册客户端时,它会发出一个信号,该信号将被捕获并且将触发一个插槽但是,它似乎不起作用。代码中的两个信号槽都不起作用。

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

1 个答案:

答案 0 :(得分: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。

我希望这会以某种方式帮助你。