簡體   English   中英

PyQt4信號不發出

[英]PyQt4 signal does not emit

我嘗試構建一個udp服務器來接收二進制消息,當套接字接收到消息時套接字會發出processMsg信號,而processMsg函數會嘗試根據消息類型發出不同的信號。 QDefines對象定義消息類型和要生成的信號。 我使用dict來解決python中缺少的開關/情況。 問題是,在收到UCSI_SET_RF_RSP_E消息后,setRfRsp函數未執行。

Main.py文件:

class mainWindow(QtGui.QMainWindow):
def __init__(self, parent = None):
    super(mainWindow, self).__init__()
    self.ui = Ui_MainWindow()
    self.defines = QDefines()
    self.connect(self.defines,QtCore.SIGNAL("signalSetRfRsp(PyQt_PyObject)"), self.setRfRsp)
    self.socket = QUdp(self.localIp, self.localPort, self.remoteIp, self.remotePort)
    self.connect(self.socket, QtCore.SIGNAL("processMsg(int,PyQt_PyObject)"), self.processMsg)
def setRfRsp(self, msg):
    if msg == 0x00000000:
        print "open"
    else:
        print "closed"
def processMsg(self, msgType, msg):
    defines = QDefines()
    msg_dict = defines.msgDictGen();
    msg_dict[msgType](msg)

define.py文件:

class QDefines(QtCore.QObject):
UCSI_SET_RF_RSP_E = 0x000d
def __init__(self, parent = None):
    super(QDefines, self).__init__()

def UCSI_SET_RF_RSP(self, msg):
    self.emit(QtCore.SIGNAL("signalSetRfRsp(PyQt_PyObject)"), msg) 

def msgDictGen(self):
    self.msgDict = {
        self.UCSI_SET_RF_RSP_E : self.UCSI_SET_RF_RSP
    } 
    return self.msgDict

發出信號的QDefines實例永遠不會將其信號連接到任何東西,並且當processMsg返回時,它只會被垃圾回收。

也許您打算寫:

    def processMsg(self, msgType, msg):
        msg_dict = self.defines.msgDictGen()
        msg_dict[msgType](msg)

您還應該考慮擺脫那種討厭的,老式的信號語法,而改用漂亮,干凈的新型

class QDefines(QtCore.QObject):
    signalSetRfRsp = QtCore.pyqtSignal(object)
    ...

    def UCSI_SET_RF_RSP(self, msg):
        self.signalSetRfRsp.emit(msg) 

class mainWindow(QtGui.QMainWindow):
    def __init__(self, parent = None):
        ...
        self.defines = QDefines()
        self.defines.signalSetRfRsp.connect(self.setRfRsp)

另外,我建議您不要嘗試在python中復制switch語句,而只需使用if/elif 在這成為嚴重的性能問題之前,您需要大量的分支機構。

暫無
暫無

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

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