簡體   English   中英

如何使用PyQt Signal Slot連接兩個類?

[英]How to connect two classes using PyQt Signal Slot?

我正在使用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()

這是我連接兩個類的方式,我不知道這是最好的方法,但是它可以按我的意願工作:

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類(自身)向MyForm類(__mForm)發出了信號,並調用了doSomething()。 但是,您可以在此行中看到: button = MyPushButton(i, self) ,我已將self(MyForm)傳遞給MyPushButton。

希望對您有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM