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

标签 python python-2.7 pyqt pyqt4 twisted

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

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 类 (self) 向 MyForm 类 (__mForm) 发出信号,并调用 doSomething() 。但正如您在这一行中看到的:button = MyPushButton(i, self),我已将 self (MyForm) 传递给 MyPushButton。

我希望这会对您有所帮助。

关于python - 如何使用 PyQt Signal Slot 连接两个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17451597/

相关文章:

python - itertools 产品 block ,当使用生成器作为参数时

python - 类中属性的顺序

python - 如何关联一对值并在给定第一个值的情况下查找第二个值?

python - Pillow (PIL) 到 QImage 的转换 -> python.exe 已停止工作

python 3 : Find length between two substrings of a string

python - 使用python版本2.7创建虚拟环境,现有版本为3.7

python - 将多个元素(基于条件)移动到列表末尾

python - 使用标签作为 pandas 数据帧的标题来旋转 Pandas 中的 XML 数据

python - QWebEngineView:显示加载进度

python - UI 关闭时 PyQT 应用程序挂起