2014-09-17 2 views
0

Я пытаюсь создать udp-сервер для получения двоичных сообщений, сокет испускает processMsg-сигнал, когда он получил сообщение, а функция processMsg пытается испускать другой сигнал в соответствии с типом сообщения. Объект QDefines определяет тип сообщения и генерируемый сигнал. Я использую dict для работы с отсутствующим переключателем/case в python. Проблема в том, что функция setRfRsp не выполнялась при получении сообщения UCSI_SET_RF_RSP_E.Сигнал PyQt4 не излучает

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) 

defines.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 

ответ

0

Экземпляр QDefines, который излучает сигнал никогда не имеет какой-либо из его сигналов, подключенных к чему-либо, и он просто получает сбор мусора, когда возвращается processMsg.

Возможно, вы имели в виду, чтобы написать:

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

Вы должны также рассмотреть вопрос о избавлении от этого синтаксиса сигнала противный, старый стиль, и использовать хороший, чистый new-style вместо:

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) 

Также , Я бы посоветовал вам забыть о попытке реплицировать операторы switch в python и вместо этого использовать if/elif. Перед началом работы вам понадобится очень большое количество филиалов, чтобы стать важной проблемой производительности.

+0

Вот и все. Я случайно воссоздаю экземпляр дважды. Спасибо за советы! Я начну привыкать к новому стилю :) – bresai

Смежные вопросы